关于遇到的 C# DES 解密出现 "CryptographicException:不正确的数据"

tomcat中的加密程序需要换到iis中,用起了 C#中的 DESCryptoServiceProvider,上网找了些相关流程写了个类,感觉比java的程序精简。

但测试中发现异常,同一次测试中,加密,解密都正常。但把加密的base64字符串,再另外测试就出现“不正确的数据”的提示。

然后再上网对比了很多,没看到什么不对的地方。程序如下:

using System;
using System.Security.Cryptography;
using System.Text;

namespace Cproject.capp
{
    public static class Crypt
    {
        private static DESCryptoServiceProvider crypt = new DESCryptoServiceProvider();
        private static bool bInit = false;
        public static void init()
        {
            if (bInit == false)
            {
                bInit = true;
                //crypt.IV = Encoding.UTF8.GetBytes("87654321");  //这里需要添加一行
                crypt.Key = Encoding.UTF8.GetBytes("12345678");
                crypt.Mode = CipherMode.CBC;
                crypt.Padding = PaddingMode.PKCS7;
            }
        }

        public static String encrypt(String str)
        {
            init();
            //用UTF-8编码,转为byte[]
            byte[] bysData = Encoding.UTF8.GetBytes(str);
            //因為PaddingMode.None的關係, byte[]的長度要是8的倍數
            //byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysData.Length / 8.0) * 8];
            //將資料複製到長度為8的倍數的byte[]
            //Array.Copy(bysData, bysFixSizeData, bysData.Length);

            //进行加密
            byte[] bysEncrypted = crypt.CreateEncryptor().TransformFinalBlock(bysData, 0, bysData.Length);
            //將byte[]轉為Base64的字串
            return Convert.ToBase64String(bysEncrypted);
        }

        public static String decrypt(String str)
        {
            init();
            byte[] bysData = Convert.FromBase64String(str);

            //进行解密
            byte[] bysDecrypted = crypt.CreateDecryptor().TransformFinalBlock(bysData, 0, bysData.Length);
            return Encoding.UTF8.GetString(bysDecrypted);
        }
    }
}


后来看了一下msdn关于 DESCryptoServiceProvider 的 成员,看到了一个IV的属性,里面有这一段描述:

若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。


意思就是另外需要再设置一个IV,这个IV跟Key的长度要一致,默认是 8 个字节。

测试终于成功通过。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值