1

ゲームでプレーヤーのデータを暗号化および復号化するための非常に単純な Caesar 暗号アルゴリズムを作成しようとしていますが、奇妙な結果が得られます。アルゴリズムのタスクは単純で、ASCII テーブル内の文字を前方または後方にプッシュするだけです。

std::string Encrypt(std::string in,int key)
{
    const char* chars=in.data();
    char* newchar=(char*)malloc(sizeof(char)*in.length());
    for(int c=0;c<in.length();c++)
    {
        newchar[c]=char(((int)chars[c])+key);//I suspect somewhere here is the problem
    }

    std::string out(newchar);
    return out;
}

LOGI("encrypt:%s",Encrypt("hello",10).data());
LOGI("decrypt:%s",Encrypt(Encrypt("hello",10),-10).data());

出力:

encrypt:rovvyu@ 
decrypt:hellok

私は暗号化についてあまり知りませんし、ASCII と文字全体が c でどのように機能するかについてもあまり知りません

4

3 に答える 3

4
std::string Encrypt(const std::string & in, int key)
{
    std::string out(in);
    for(int i=0; i < in.length(); ++i)
    {
        out[i] += key;
    }
    return out;
}
于 2012-10-06T16:54:37.780 に答える
0

問題は、a..z の値に「キー」を追加しても、その範囲に戻らない可能性があることです。何かのようなもの

if (chars[c] >= 'a' && chars[c] <='z') newchar[c] = 'a' + ((chars[c]-'a'+key)%26);
else if (chars[c] >= 'A' && chars[c] <='Z') newchar[c] = 'A' + ((chars[c]-'A'+key)%26);
else newchar[c] = chars[c];

そんなに弱いものを使う正当な理由があることを願っています。ところで、26 キーを使用して反転します。

于 2012-10-06T16:56:16.267 に答える
-1

シーザー暗号の作成方法を知りたいだけなら、かっこいいです。実際に一部のデータを保護したい場合は、これを行わないでください。これは、ピッグラテンよりも暗号化された方法ではありません。

代わりに、事前に作成された暗号化ライブラリを使用してください。それを正しくするのに長い時間がかかるので、あなた自身を書かないでください。AESは高速で、ほとんどの場合に十分であり、ほぼすべてのプログラミング言語用のライブラリがあります。

于 2012-11-16T00:08:09.723 に答える