http://dixq.net/g/h_10.html
変数を常に排他的論理和でXOR暗号化していました。
しかしそれだけでは突破されてしまいました。
なので今回はint型の代わりにEncryptedIntで変数を保持するようにしました。
EncryptedIntクラスの中身はこのようになっています。
演算子オーバーロード部は省略していますが、普通のint型と同じように使えます。
ただし変数に値を代入するたびに変数のアドレスが変わりますので改竄を難しくしてあり
リンク先のような「スペシャルねこまんま57号」で値を絞っていくような方法には効果的だと思っています。
#pragma once
class EncryptedInt
{
int* value;
public:
EncryptedInt();
void set(int value);
int get();
};
#include "EncryptedInt.h"
#include
const static int KEY = 0x0123'4567'89AB'CDEF; //XOR暗号キー'
EncryptedInt::EncryptedInt()
{
value = new int;
*value = 0 ^ KEY;
}
EncryptedInt::~EncryptedInt()
{
delete value;
}
void EncryptedInt::set(int v)
{
int n = GetRand(3000); //適当にnew繰り返す分
int** pool = new int*[n];
int tmp = *value;
for (int i = 0; i<n; i++) {
pool[i] = new int;
}
delete value;
value = new int;
*value = v ^ KEY;
for (int i = 0; i<n; i++) {
delete pool[i];
}
delete[] pool;
}
int EncryptedInt::get()
{
return (*value) ^ KEY;
}
改竄されたくない値は全部これ使えばいいってことになりますね。
で、安全性を高めたいんですが、もっと解析が困難になる方法ありませんかね?