3

アプリケーションでDES-ECB+base64暗号化を使用しています。それは私が「暗号」と呼んだクラスのコードです

public class Crypto
{

    public static string Decrypt(string encryptedString)
    {
        DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
        desProvider.Mode = CipherMode.ECB;
        desProvider.Padding = PaddingMode.PKCS7;
        desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
        using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(encryptedString)))
        {
            using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateDecryptor(), CryptoStreamMode.Read))
            {
                using (StreamReader sr = new StreamReader(cs, Encoding.ASCII))
                {
                    return sr.ReadToEnd();
                }
            }
        }
    }

    public static string Encrypt(string decryptedString)
    {
        DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
        desProvider.Mode = CipherMode.ECB;
        desProvider.Padding = PaddingMode.PKCS7;
        desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
        using (MemoryStream stream = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write))
            {
                byte[] data = Encoding.Default.GetBytes(decryptedString);
                cs.Write(data, 0, data.Length);
                return Convert.ToBase64String(stream.ToArray());
            }
        }
    }
}

しかし、文字列を暗号化してから再度復号化し、もう一度暗号化すると、暗号化された文字列は以前の暗号化と同じではありません。これが最初の暗号化された文字列です。

Ken0hup / DQZ8kxa7nyivjg6jl3haljjhbq1ufetqtwapwizw // 03m0uxf8dbuyzo2boz5vsvcxrjf1lpfzlwxdsdekac43l2k2ooyrxtn / da6kmm13ys9xoezgiroqfvj5qrkdokjrcvj0gyffoh2oedgyn + eaw5dgzsp697kj4 =

そしてここに2番目の暗号化された文字列があります:

kEN0HUp / dqz8kXA7nYivJG6Jl3haLJjhBq1UfEtQTwaPwizW // 03M0UxF8dBuYZo2BoZ5vsVcXRJF1LpFZLWxDsdeKAC43L2K2OoYRxTn / dA

最初の文字列のこの「Dgzsp697kj4=」を除いて、これらはほとんど同じです。
どうしたの?
前もって感謝します。

4

2 に答える 2

5

データが失われています。Encrypt() メソッドでは、EncryptFinalBlock() を呼び出して、パディング アルゴリズムが完了したことを認識し、パディングを追加できるようにする必要があります。

using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateEncryptor(), CryptoStreamMode.Write))
{
  byte[] data = Encoding.Default.GetBytes(decryptedString);
  cs.Write(data, 0, data.Length);
  cs.FlushFinalBlock(); // <-- Add this
  return Convert.ToBase64String(stream.ToArray());
}
于 2011-07-24T18:34:01.250 に答える
1

同様の問題がありました。復号化された文字列の末尾に空白が追加されていないことを確認する必要があります。空白を削除する必要がある場合があります。

于 2011-07-24T18:12:14.370 に答える