1

私はそのような TripleDes クラスを作成しました:

class TripleDes_Crypto
{
    // Key Lenght must be 24
    string Key = string.Empty;
    // IV Lenght must be 8
    string IV = string.Empty;

public TripleDes_Crypto(string KEY, string IV)
{
    this.Key = KEY;
    this.IV = IV;
}

public string Encrypt(string Data)
{
    byte[] key = Encoding.ASCII.GetBytes(Key);
    byte[] iv = Encoding.ASCII.GetBytes(IV);
    byte[] data = Encoding.ASCII.GetBytes(Data);
    byte[] enc = new byte[0];

    TripleDES tdes = TripleDES.Create();
    tdes.IV = iv;
    tdes.Key = key;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.Zeros;

    // encryption
    ICryptoTransform ict = tdes.CreateEncryptor();
    enc = ict.TransformFinalBlock(data, 0, data.Length);

    return ASCIIEncoding.ASCII.GetString(enc);
}

public string Decrypt(string Data)
{
    byte[] key = Encoding.ASCII.GetBytes(Key);
    byte[] iv = Encoding.ASCII.GetBytes(IV);
    byte[] data = Encoding.ASCII.GetBytes(Data);
    byte[] dec = new byte[0];

    TripleDES tdes = TripleDES.Create();
    tdes.IV = iv;
    tdes.Key = key;
    tdes.Mode = CipherMode.CBC;
    tdes.Padding = PaddingMode.Zeros;

    // decryption
    ICryptoTransform ict = tdes.CreateDecryptor();
    dec = ict.TransformFinalBlock(data, 0, data.Length);

    return ASCIIEncoding.ASCII.GetString(dec);
}

}

そして私は使用しました:

    private void button1_Click(object sender, EventArgs e)
    {
        TripleDes_Crypto tdes = new TripleDes_Crypto("passwordDR0wSS@P6660juht", "password");
        File.WriteAllText(@"encrypted", tdes.Encrypt("Hey TEST DATA"));
        MessageBox.Show(tdes.Decrypt(File.ReadAllText(@"encrypted")));
    }

暗号化方法は正常に機能しますが、復号化を使用すると出力されるはずのランダムデータが生成されるため、復号化方法が問題です:Hey TEST DATA.

事前に助けてくれてありがとう。

4

1 に答える 1

3

これらはあなたの問題です:

return ASCIIEncoding.ASCII.GetString(enc);
...
byte[] data = Encoding.ASCII.GetBytes(Data);

暗号化されたデータを ASCII テキストのように扱っています。そうではありません。データが失われています。

テキストを失うことなく任意のバイナリ データを表すには、ほとんどの場合 Base64 を使用する必要があります。

return Convert.ToBase64String(enc);
...
byte[] data = Convert.FromBase64String(Data);

さらに、key/iv テキストをバイトに変換するために ASCII 以外のものを使用することをお勧めします。また、パラメーターの .NET 命名規則に従います。

于 2012-08-06T06:41:16.173 に答える