跨语言使用对称加密
程序员文章站
2022-06-09 15:26:25
...
这两天在写GM工具,使用wxPython开发,GM工具需要与Web服务器进行简单的交互,Web服务器是用.NET写成。一些关键的数据在传输的过程中进行了加密。.NET有非常完整的加密库,使用也很方便,翻箱倒柜从以前的代码中整了一些对称加密算法出来。而Python标准模块只提供一些hash加密算法,没有提供私钥加密与共钥加密算法,但是借助于开源社区强大的威力,可以很方便的找到加密库。从网上找了一pyDes模块,它实现了DES与TripleDES算法,经过简单的测试,用.NET加密,用Python解密或者用Python加密,用.NET解密没有任何问题。写这篇文件,做个标记,以后再用到类似的应用时,直接翻出来使用,yeah~~~
.NET提供的3DES加密算法:
class TripleDES { public byte[] _key, _iv; /// <summary> /// 构造函数 /// </summary> /// <param name="key">密钥</param> /// <param name="iv">初始化向量</param> public TripleDES(string key, string iv) { if (key.Length != 16 && key.Length != 24) throw new ArgumentException("TripleDES算法的加密密钥长度为128位或192位."); if (iv.Length == 0 || iv.Length % 8 != 0) throw new ArgumentException("TripleDES算法的初始化向量长度必须是64的整数倍且不能为0."); _key = Encoding.UTF8.GetBytes(key); _iv = Encoding.UTF8.GetBytes(iv); } /// <summary> /// 加密数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public string Encrypt(string data) { //将数据编码为字节数组 byte[] byteData = Encoding.UTF8.GetBytes(data); //创建加密流 MemoryStream ms = new MemoryStream(); TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Mode = CipherMode.CBC; CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(_key, _iv), CryptoStreamMode.Write); //将加密后的结果写到 流 中 cs.Write(byteData, 0, byteData.Length); cs.FlushFinalBlock(); string result = Convert.ToBase64String(ms.ToArray()); ms.Close(); cs.Close(); return result.ToString(); } /// <summary> /// 解密数据 /// </summary> /// <param name="enData"></param> /// <returns></returns> public string Decrypt(string enData) { byte[] byteData = Convert.FromBase64String(enData); MemoryStream ms = new MemoryStream(); TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Mode = CipherMode.CBC; CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(_key, _iv), CryptoStreamMode.Write); cs.Write(byteData, 0, byteData.Length); cs.FlushFinalBlock(); string result = Encoding.UTF8.GetString(ms.ToArray()); cs.Close(); ms.Close(); return result; } public static TripleDES _3DES = new TripleDES("0123456789012345", "01234567"); public static string En(string data) { return _3DES.Encrypt(data); } public static string De(string enData) { return _3DES.Decrypt(enData); } }
Python版本:
import pyDes _3DES = pyDes.triple_des('0123456789012345', pyDes.CBC, '01234567', pad = None, padmode = pyDes.PAD_PKCS5) def Encrypt(data): e = _3DES.encrypt(data) return base64.b64encode(e) def Decrypt(enData): d = base64.b64decode(enData) return _3DES.decrypt(d)
上一篇: 一篇很棒的文章:浏览器是怎么工作的(转载至站长之家)
下一篇: 形象生动的html解析原理(转载)