首页 > 解决方案 > C#中的加密解密解密不起作用

问题描述

我有一个 java 代码,我必须用 C# 对其进行转换,如下所示

加密:

 public String encrypt(String value)
    {
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        AesManaged tdes = new AesManaged();
        tdes.Key = UTF8.GetBytes(securityKey);
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform crypt = tdes.CreateEncryptor();
        byte[] plain = Encoding.UTF8.GetBytes(value);
        byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
        String encryptedText = Convert.ToBase64String(cipher);
        return encryptedText;
    }

现在我正在尝试编写反转过程

public String decrypt(String value)
    {                   
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        AesManaged tdes = new AesManaged();
        tdes.Key = UTF8.GetBytes(securityKey);
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform crypt = tdes.CreateDecryptor();
        byte[] plain = Encoding.UTF8.GetBytes(value);
        byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
        String encryptedText = Convert.ToBase64String(cipher);
        return encryptedText;
    }

但逆转不起作用。

错误:类型异常

“System.Security.Cryptography.CryptographicException”发生在 mscorlib.dll 中,但未在用户代码中处理

附加信息:填充无效且无法移除。

堆栈跟踪:

System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) 在 System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) at redis2.Crypto.AESECBPKCS5PaddingEncryptor.decrypt(String value) in e:\TestApplication\Redis\redis2\redis2\Crypto\AESECBPKCS5PaddingEncryptor.cs: 第 53 行在 redis2.WebForm1.Page_Load(Object sender, EventArgs e) 在 e:\TestApplication\Redis\redis2\redis2\WebForm1.aspx.cs:line 14 at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad (EventArgs e) 在 System.Web.UI.Control.LoadRecursive() 在 System.Web.UI.Page。ProcessRequestMain(布尔型 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)

更新 1

 public String decrypt(String value)
    {                   
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        AesManaged tdes = new AesManaged();
        tdes.Key = UTF8.GetBytes(securityKey);
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform crypt = tdes.CreateDecryptor();
       // value = Convert.FromBase64String(value);
        byte[] plain = Convert.FromBase64String(value);
        byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
        String encryptedText = Convert.ToBase64String(cipher);
        return encryptedText;
    }

标签: c#encryption

解决方案


tdes.Key = UTF8.GetBytes(securityKey);

从字符串中获取密钥总是错误的方法。

  • 当你有密码时,使用 Rfc2898DeriveBytes
  • 当您需要传递随机二进制密钥时,请使用Convert.FromBase64String()

String encryptedText = Encoding.UTF8.GetString(cipher);

将二进制数据作为文本传输是错误的方式。这甚至不会往返,因为 UTF8 有转义序列来编码非 ASCII 标记。你不能把它们分开。

利用Convert.ToBase64String(byte[])


推荐阅读