首页 新闻 会员 周边

.NET Core 关于 DES加密 解密 Windows的加密数据和Linux不一致。

0
悬赏园豆:10 [已解决问题] 解决于 2020-04-01 18:20

代码部分

//des 加密解密
public class CryptoHelper
{
        private const string key = "66666des";
        private const string iv = "des66666";
        /// <summary>
        /// 使用DES加密
        /// </summary>
        /// <param name="plain">明文</param>
        /// <returns>返回密文</returns>
        public static string DesEncode(string plain)
        {
            //把密钥转换成字节数组
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);

            //把向量转换成字节数组
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);

            //声明1个新的DES对象 
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            des.Mode = CipherMode.ECB;

            //开辟一块内存流
            MemoryStream msEncrypt = new MemoryStream();

            //把内存流对象包装成加密流对象 
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, des.CreateEncryptor(keyBytes, ivBytes), CryptoStreamMode.Write);

            //把加密流对象包装成写入流对象
            StreamWriter swEncrypt = new StreamWriter(csEncrypt);

            //写入流对象写入明文  
            swEncrypt.WriteLine(plain);

            //写入流关闭  
            swEncrypt.Close();

            //加密流关闭  
            csEncrypt.Close();

            //把内存流转换成字节数组,内存流现在已经是密文了  
            byte[] bytesCipher = msEncrypt.ToArray();

            //内存流关闭 
            msEncrypt.Close();
            //将字节数组转化成Base64字符串
            return Convert.ToBase64String(bytesCipher);
        }

        /// <summary>
        /// 使用DES解密
        /// </summary>
        /// <param name="cipher">密文</param>
        /// <returns>返回密文</returns>
        public static string DesDeCode(string cipher)
        {
            //将密文通过Base64位还原成字节数组
            byte[] cipherByte = Convert.FromBase64String(cipher);

            //把密钥转换成字节数组
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);

            //把向量转换成字节数组
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);

            //声明1个新的DES对象 
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            des.Mode = CipherMode.ECB;

            //开辟一块内存流,并存放密文字节数组
            MemoryStream msDecrypt = new MemoryStream(cipherByte);

            //把内存流对象包装成解密流对象 
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, des.CreateDecryptor(keyBytes, ivBytes), CryptoStreamMode.Read);

            //把解密流对象包装成写入流对象
            StreamReader srDecrypt = new StreamReader(csDecrypt);

            //明文=读出流的读出内容   
            string strPlainText = srDecrypt.ReadLine();

            //读出流关闭  
            srDecrypt.Close();

            //解密流关闭  
            csDecrypt.Close();

            //内存流关闭  
            msDecrypt.Close();

            //返回明文  
            return strPlainText;
        }
}

被加密文字:admin
Windows得到的密文为:mpeF1AIykkU=
Linux得到的密文为:QDI3HuQF+SQ=

低调De程序猿的主页 低调De程序猿 | 初学一级 | 园豆:38
提问于:2020-03-31 22:59

@dudu 救命!!

前进的步伐 4年前
< >
分享
最佳答案
1

swEncrypt.WriteLine(plain); 的问题
Windows 用 \r\n 换行
Linux 用 \n 换行

收获园豆:10
·风信子· | 菜鸟二级 |园豆:202 | 2020-04-01 18:00

谢谢!!!!

低调De程序猿 | 园豆:38 (初学一级) | 2020-04-01 18:20
其他回答(1)
0

不同平台上都是这段代码?

会长 | 园豆:12401 (专家六级) | 2020-04-01 09:37

是的,开发环境是Windows,部署在Linux,你可以测试下,一直不明白为什么,以后移至也会成问题,开发环境和部署环境不一致。

支持(0) 反对(0) 低调De程序猿 | 园豆:38 (初学一级) | 2020-04-01 15:19

@前进的步伐: 那就好办了,设个断点,或者写日志,看看那条语句的执行结果不一样

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-04-01 15:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册