前言
这里对之前对接的公司中的代码demo做一个总结,原本为清一色的java,哈哈。这里都转成C#。用到的库是Portable.BouncyCastle。官网。之前也是准备用.net core 内置的类,方法,但实际在用的时候比如因为desKey并不是特定长度的,导致抛了一些异常,于是就改用了这个库。
这个库中有如下这么一段的介绍:
The lightweight API works with everything from the J2ME to the JDK 1.7 and there is also an API in C# providing equivalent functionality for most of the above.
实际用下来也确实如此,方法基本上是“相同”名字的。
正文
Des
这是一种对称密钥加密算法,也就是说加密解密的秘钥是一样的。
- 加密
public static string DesEncrypt(string dataXml, string desKey)
{
var keyParam = ParameterUtilities.CreateKeyParameter("DES", Convert.FromBase64String(desKey));
var cipher = (BufferedBlockCipher) CipherUtilities.GetCipher("DES/NONE/PKCS5Padding");
cipher.Init(true, keyParam);
var bs = Encoding.UTF8.GetBytes(dataXml);
var rst = cipher.DoFinal(bs);
// var asciiBs = Encoding.ASCII.GetBytes(Encoding.UTF8.GetString(rst));
return Convert.ToBase64String(rst);
}
看方法签名,需要两个参数,1.要加密的内容,2.加密的秘钥。先用desKey作为参数创建一个keyParam。然后用DES/NONE/PKCS5Padding
作为参数获取一个cipher,这个参数用来详细描述des加密时候的相关细节,具体是根据对方给的代码里面来的。然后对这个cipher做一个初始化,第一个参数true
表示这个cipher是用来加密的,并且传入之前的keyParam。然后获取加密内容的字节数组,编码是utf-8,一般都是这个编码。然后调用cipher的DoFinal方法就能获取加密之后的内容了。最后一行转成了一个base64字符串。
通过这个方法就能对数据进行des加密了。中间也涉及了字符编码格式,base64转换的内容,这些是根据给的demo写的。
- 解密
public static string DesDecrypt(string text, string desKey)
{
var keyParam = ParameterUtilities.CreateKeyParameter("DES", Convert.FromBase64String(desKey));
var cipher = (BufferedBlockCipher) CipherUtilities.GetCipher("DES/NONE/PKCS5Padding");
cipher.Init(false, keyParam);
var bs = Convert.FromBase64String(text);
var rst = cipher.DoFinal(bs);
return Encoding.UTF8.GetString(rst);
}
下面是解密方法。两个参数,1.需要解密的内容。 2.解密的key。这个key是和加密的时候一样的。首先也是通过desKey获取一个keyParam,然后用DE