2

文字列を取得してバイトに変換し、XORしてbase64を適用する単純な暗号化関数があります。

JAVA:

String key = "1234";
public String encrypt(String plainText) throws Exception {

    byte [] input = plainText.getBytes("UTF8");
    byte [] output = new byte[input.length];
    for(int i=0; i<input.length; i++)
        output[i] = ((byte)(input[i] ^ key.charAt(i % key.length())));

    String utf8 = new String(output);
    return Utils.encode(utf8); 
}

次に、それをファイルに保存し、次の復号化方法を使用してC#の別のアプリケーションで開きます。

C#:

string key="1234";
public string Decrypt(string CipherText)
{
    var decoded = System.Convert.FromBase64String(CipherText);
    var dexored = xor(decoded, key);
    return Encoding.UTF8.GetString(dexored);
}

byte[] xor(byte[] text, string key)
{
    byte[] res = new byte[text.Length];

    for (int c = 0; c < text.Length; c++)
    {
        res[c] = (byte)((uint)text[c] ^ (uint)key[c % key.Length]);
    }

    return res;
}

問題は、ěščřžýáíのようなアクセントのある文字がデコードに失敗することです。

問題がどの部分から発生しているのかを判断する方法や、問題を見つける方法を知っていますか?それはUTF-8と関係があるように私には見えます。

より良い暗号化のための提案は必要ありません。私はすでにAESを使用していますが、パフォーマンスの問題のためにxoredbase64に切り替えたいと思います。

ありがとうございました。

4

1 に答える 1

2

これが問題です:

String utf8 = new String(output);
return Utils.encode(utf8); 

outputここでは、実際にはテキストではないデータから文字列を作成するのではなく、base64を使用する必要があります。何らかの理由で入力文字列をバイトにUtils.encode変換してbase64エンコーディングを実行することは可能ですが、基本的には、コンストラクターを使用して暗号化されたバイトで文字列を作成するべきではありません。String

Utilsクラスにメソッドがあり、それencode(byte[])実際にbase64でデータをエンコードしている場合(使用しているコードの半分しかないのは非常にイライラします)、次のように使用できます。

return Utils.encode(output);
于 2012-11-05T16:07:43.200 に答える