700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java 和 c# 下的RSA证书+AES+DES加解密实现

java 和 c# 下的RSA证书+AES+DES加解密实现

时间:2021-03-20 07:52:07

相关推荐

java 和 c# 下的RSA证书+AES+DES加解密实现

java 和 c# 下的RSA+AES+DES加解密实现

前言

在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是比较常用的几种加解密方式,使用和实现方式都比较成熟可靠,本文简要介绍一下分别在java和c#两种语言中实现RSA+AES加密请求,然后通过http远程调用服务器后,再通过RSA+DES解密返回的实现方式(如果需要了解几种加密方式的原理的同学请参考来自一位美女同学推荐的学习视频:/course/3790.html)。

另外还有一篇漫画形式介绍AES的文章:/a/88301_478315

思路

1、在RSA+AES/DES加密过程中,AES/DES用来加密实际的数据包,RSA非对称加密用来加密秘钥,然后需要同时把加密后的秘钥和数据包传送给服务器,解密过程与之相反。

2、AES/DES需要的秘钥可以随机产生,但需要注意JAVA里默认支持的秘钥长度为128 位字节即16个字符,如果超出长度会报错。

3、AES加密工作模式区分为电码本模式(Electronic Codebook Book (ECB));2密码分组链接模式(Cipher Block Chaining (CBC));计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB)),如果采用ECB模式不需要用到偏移量IV,案例采用的CBC模式需要用到IV,java里AES偏移量长度必须为16位字节,如果加密时不指定IV,可以自动产生,但是解密的时候就没法解密了。

4、指定填充模式,填充模式就是当被加密的数据块被划分为数据块以后长度不够的部分,需要补足不足部分,案例中AES使用的填充模式为PKCS5Padding,RSA使用的填充模式为ISO10126

5、RSA所需要的公钥和私钥证书可以自行通过工具或者linux服务器自带的OPENSSL产生,参考:/qq_15259303/article/details/81133735

但需要注意的是,只有java可以支持jks格式的证书,其他语言需要把jks格式的证书转为pem或者pfx格式。

JAVA 实现RSA+AES/DES方法一

先介绍一种比较快的方法,但这种方法只能在java中使用,并且只能针对XML格式的字符串加解密,c#中没有找到类似的方法,而且java用此方法需要外部依赖包xmlsec-1.5.1.jar :

/Code/Jar/x/Downloadxmlsec151jar.htm

加密类如下:

package .security.de;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.StringWriter;import java.io.UnsupportedEncodingException;import .URL;import java.security.Key;import java.security.KeyFactory;import java.security.Security;import java.security.cert.Certificate;import java.security.cert.CertificateFactory;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.apache.xml.security.encryption.EncryptedData;import org.apache.xml.security.encryption.EncryptedKey;import org.apache.xml.security.encryption.XMLCipher;import org.apache.xml.security.keys.KeyInfo;import org.w3c.dom.Document;import org.w3c.dom.Element;import sun.misc.BASE64Decoder;public class XMLEncrypt {private Key keyEncryptKey = null;public static XMLCipher keyCipher = null;private XMLCipher xmlCipher = null;private Transformer transformer = null;private KeyGenerator keyGenerator = null;private Key symmetricKey = null;public static final String X509 = "X.509";public XMLEncrypt() {org.apache.xml.security.Init.init();Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());String algorithm = "/2001/04/xmlenc#aes128-cbc";String symmetricKeyAlg = "AES";int symmetricKeyLen = 128;String certificatePath = "/公钥.pem";InputStream is = null;try {URL url = this.getClass().getResource(certificatePath);is = url.openStream();CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);Certificate certificate = certificateFactory.generateCertificate(is);keyEncryptKey = (RSAPublicKey) certificate.getPublicKey();xmlCipher = XMLCipher.getInstance(algorithm);TransformerFactory factory = TransformerFactory.newInstance();transformer = factory.newTransformer();SecretKeySpec keySpec = new SecretKeySpec(pwdHandler(NomalEncrypt.key), "AES");symmetricKey = keySpec; xmlCipher.init(XMLCipher.ENCRYPT_MODE, keySpec);} catch (Exception e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}private static byte[] pwdHandler(String password) throws UnsupportedEncodingException {byte[] data = null;if (password == null) {password = "";}StringBuffer sb = new StringBuffer(16);sb.append(password);while (sb.length() < 16) {sb.append("0");}if (sb.length() > 16) {sb.setLength(16);}data = sb.toString().getBytes("UTF-8");return data;}public String ecrypt(String plainText) throws Exception {// parse file into documentDocument document = parseString(plainText);XMLCipher keyCipher = XMLCipher.getInstance(XMLCipher.RSA_v1dot5);keyCipher.init(XMLCipher.WRAP_MODE, keyEncryptKey);// encrypt symmetric keyEncryptedKey encryptedKey = keyCipher.encryptKey(document, symmetricKey);// add key info to encrypted data elementEncryptedData encryptedDataElement = xmlCipher.getEncryptedData();KeyInfo keyInfo = new KeyInfo(document);keyInfo.add(encryptedKey);encryptedDataElement.setKeyInfo(keyInfo);// do the actual encryption encryptContentsOnly=falsexmlCipher.doFinal(document, document.getDocumentElement(), false);return writeEncryptedDocToString(document);}public Document parseString(String str) throws Exception {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();InputStream is = new ByteArrayInputStream(str.getBytes());return db.parse(is);}public SecretKey GenerateSymmetricKey() throws Exception {return keyGenerator.generateKey();}private String writeEncryptedDocToString(Document doc) throws Exception {DOMSource source = new DOMSource(doc);StringWriter stringWriter = new StringWriter();StreamResult result = new StreamResult(stringWriter);transformer.transform(source, result);return stringWriter.getBuffer().toString();}}

加密后会得到一个xml,ds:KeyInfo 里会存放RSA加密后的base64编码秘钥,xenc:CipherData里存放偏移矢量IV+AES加密后的密文,两者是通过字节数组直接拼接后,然后转为base64编码的字符串。

<?xml version="1.0" encoding="UTF-8" standalone="no"?><xenc:EncryptedData xmlns:xenc="/2001/04/xmlenc#" Type="/2001/04/xmlenc#Element"><xenc:EncryptionMethod Algorithm="/2001/04/xmlenc#aes128-cbc"/><ds:KeyInfo xmlns:ds="/2000/09/xmldsig#"><xenc:EncryptedKey><xenc:EncryptionMethod Algorithm="/2001/04/xmlenc#rsa-1_5"/><xenc:CipherData><xenc:CipherValue>HY+RIximKzdVGey/T2T4WlsDtBrRzBM9XPW12312313Ikix1Q4Ny2qzZILyWku6qBVHSQEV1hS7P/oJfR8pUSDwbVlG8gEdK/e3NYtwNAmxaWm2m62FzpBnY=</xenc:CipherValue></xenc:CipherData></xenc:EncryptedKey></ds:KeyInfo><xenc:CipherData><xenc:CipherValue>SyeQ5A8D2otzXkLQvAy4H1lfb7RD4H78Ve3Cr5XGUAfRzgoMROVT8Q9dnHwL2iJ1KUrEr9nvK7ztM2Kg3uqtKy2K8CbKHsLcJDEexZrfycCvf3IA7zSiP9COeapiBQvwLa52FX+35gc63cQHy8mUW330LWyyZ6jNxPxEObcmNVsqShw6u3LGXcBNe9j2Rs4VWnmlUvZtXsCL9piSahYaGqRFRixkNgVvI9RU9izmuFSAwFULHXhnK312h/XDS36uNEQ0xqU5n7S7Rv+ZwtOMrvOT8yRY9r2zn3ZHjxL0yNHZ/LbW9qZyFDsbbPMnCDhIwKX/ZAuHCEoc2Bb/HBCLR3YtVfnxv48dhe/2lrLpF07bPFD0AcIPl0o9OSWUGAtxZwUfvjsylxN/wz2svHiTH3ojvS350H/3F+3j9LhKJ9j7snFCBrei32g2qKWdRAxvG774UAuNJMfaTTItuPOdTuOD+Pj1y1P1vdJDybLDwVZjnix8dlHmnsDphx9knz+n9tEodqihACVmLzvQ30cx69DAEUW+4TlSze45qV8/4tDqpBMhEN29nUsLiA7okx1VTxlHWgGgRV0DLb3OVOQFZrGwdIMtm0k3ZuXscGMnODyO38APpm5dadyrHUL0uJjtPhAKyK4qUnMV02gzDjkDWEe+kiR028weMq+yaFfe0+cJDu5uda3kuJg/thjKDdRj6BaOngmGkDIVsovEQJaowt9s4sllMGPCPGvf2Is03NFHbX/1XaETjCd3aly/A8S4IY1233123+4sK8aYhX7I2mcQLv3IHGsWX6b+vKDwAXIe9qlxfOqjz5AdydPjDKtNhK1aPIFMvIGGfdwb/Cqs0yYzo/qhScKvqf3dkBRgrPMOY9Dq0A9Kg0FKzCmHuwKUZ6qZQDUSw7z4PxSW55FuTtR6g1hfkU1vYVvYSUfFxcibeY8rLs1hj/WNgTf8j08dSS3jGc0myteA6ILt+uNltmvMy9NwzCwuwE58msppgJJG5Dy0OgqMkzDEiT9la+Ml53N3KS8YL9OkGYl0S0oS0I8WDaFfRZSQQCtGsEUeIcUHuXrZ9S/NgUR+HfJ0i88up+X6DFk0WS284WfZOhullQuGp2KxWFvC1jQc9HzD1JWubtLH8mJ2VEXptTcji9RndFD2SDXw9hTrlkYcctG78Zflm0B4xAevuW7arvcccHO0DPTB5X17flMUhfTHc8y6aJW6HL9b7gtAKHRUDXeH3tvcaBJ3jxNGO93O8MZN+J7Ysr0QxW6jEJU0C/LNQJWO5pj0WfI3W0B/gEjlj/vW54PDgV6UU+Ox</xenc:CipherValue></xenc:CipherData></xenc:EncryptedData>

解密代码如下:

package .security.de;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.StringWriter;import .URL;import java.security.Key;import java.security.KeyFactory;import java.security.Security;import java.security.interfaces.RSAPrivateKey;import java.security.spec.PKCS8EncodedKeySpec;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.apache.xml.security.encryption.XMLCipher;import org.w3c.dom.Document;import org.w3c.dom.Element;import sun.misc.BASE64Decoder;public class XMLDecrypt {public static final String X509 = "X.509";private Transformer transformer = null;private XMLCipher decryptXmlCipher = null;private javax.xml.parsers.DocumentBuilderFactory dbf = null;private javax.xml.parsers.DocumentBuilder db = null;public XMLDecrypt() throws Exception {org.apache.xml.security.Init.init();Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());String certificatePath = "/私钥.pem";try {URL url = this.getClass().getResource(certificatePath);InputStream is = url.openStream();InputStreamReader read = new InputStreamReader(is, "UTF-8");//Key privateKey = loadPrivateKeyByStr(loadPrivateKeyByFile(read));TransformerFactory factory = TransformerFactory.newInstance();transformer = factory.newTransformer();decryptXmlCipher = XMLCipher.getInstance();decryptXmlCipher.init(XMLCipher.DECRYPT_MODE, null);decryptXmlCipher.setKEK(privateKey);dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();dbf.setNamespaceAware(true);db = dbf.newDocumentBuilder();} catch (Exception e) {e.printStackTrace();throw new Exception("初始化失败");}}public static String loadPrivateKeyByFile(InputStreamReader read)throws Exception {BufferedReader bufferedReader = null;try {bufferedReader = new BufferedReader(read);String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = bufferedReader.readLine()) != null) {if (readLine.charAt(0) == '-') {continue;} else {sb.append(readLine);sb.append('\r');}}return sb.toString();} catch (IOException e) {throw new Exception("私钥数据读取错误");} catch (NullPointerException e) {throw new Exception("私钥输入流为空");} finally {if (bufferedReader != null) {try {bufferedReader.close();} catch (Exception e) {}}}}public static RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr) {try {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);} catch (Exception e) {e.printStackTrace();}return null;}public static String getFileString(String filename) throws Exception {FileInputStream fis = new FileInputStream(filename);ByteArrayOutputStream outByteArray = new ByteArrayOutputStream();int i = -1;while ((i = fis.read()) != -1)outByteArray.write((byte) i);String str = outByteArray.toString();fis.close();outByteArray.close();return str;}public Document parseFile(String fileName) throws Exception {return db.parse(fileName);}public Document parseString(String str) throws Exception {InputStream is = new ByteArrayInputStream(str.getBytes());return db.parse(is);}private String writeEncryptedDocToString(Document doc) throws Exception {DOMSource source = new DOMSource(doc);StringWriter stringWriter = new StringWriter();StreamResult result = new StreamResult(stringWriter);transformer.transform(source, result);return stringWriter.getBuffer().toString();}public String decrypt(String cryptograph) throws Exception {return decrypt(cryptograph, null);}public String decrypt(String plainText, String charsetName)throws Exception {// load the encrypted file into a DocumentDocument document = parseString(plainText);// get the encrypted data elementElement encryptedDataElement = document.getDocumentElement();// do the actual decryptiondecryptXmlCipher.doFinal(document, encryptedDataElement);return writeEncryptedDocToString(document);}}

JAVA 实现RSA+AES/DES方法二

第二种方法是使用JDK自带的Ciper类分别实现几种加解密,操作起来相对比较复杂,但是灵活性比较高。

package .security.de;import java.io.InputStream;import .URL;import java.security.Key;import java.security.cert.Certificate;import java.security.cert.CertificateFactory;import java.security.interfaces.RSAPublicKey;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Encoder;public class NomalEncrypt {public static final String X509 = "X.509";public static final byte[] iv = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};public static final String key = "1234567890123456";public static final String data = "<haha>hah</haha>";public static void main(String[] args) {NomalEncrypt ne = new NomalEncrypt();String rsaKey = ne.rsaEncrypte(key);System.out.println("RSA 秘钥为:" + rsaKey);byte[] encrypt = encrypt(data, key);byte[] afterConcact = new byte[encrypt.length + iv.length];BASE64Encoder encoder = new BASE64Encoder();System.arraycopy(iv, 0, afterConcact, 0, iv.length);System.arraycopy(encrypt, 0, afterConcact, iv.length, encrypt.length);System.out.println("加密前:" + data);System.out.println("没拼接编码后:" + encoder.encode(encrypt));System.out.println("拼接编码后:" + encoder.encode(afterConcact));}public static void fullEncryped() {NomalEncrypt ne = new NomalEncrypt();String rsaKey = ne.rsaEncrypte(key);System.out.println("RSA 秘钥为:" + rsaKey);byte[] encrypt = encrypt(data, key);byte[] afterConcact = new byte[encrypt.length + iv.length];BASE64Encoder encoder = new BASE64Encoder();System.arraycopy(iv, 0, afterConcact, 0, iv.length);System.arraycopy(encrypt, 0, afterConcact, iv.length, encrypt.length);System.out.println("加密前:" + data);System.out.println("没拼接编码后:" + encoder.encode(encrypt));System.out.println("拼接编码后:" + encoder.encode(afterConcact));}public static byte[] encrypt(String data, String key) {// 偏移量try {Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding");byte[] dataBytes = data.getBytes();SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");// 设置偏移量参数IvParameterSpec ivSpec = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);// 可用的byte[] encryped = cipher.doFinal(dataBytes);return encryped;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public String rsaEncrypte(String data) {try {String certificatePath = "/公钥.pem";URL url = this.getClass().getResource(certificatePath);InputStream is = url.openStream();CertificateFactory certificateFactory = CertificateFactory.getInstance(X509);Certificate certificate = certificateFactory.generateCertificate(is);Key keyEncryptKey = (RSAPublicKey) certificate.getPublicKey();Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, keyEncryptKey);byte[] result = cipher.doFinal(data.getBytes());BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(result);} catch (Exception e) {e.printStackTrace();}return null;}}

AES解密代码为:

package .security.de;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;public class NomalDecrypte {public static void main(String[] args) {try {BASE64Decoder base64de=new BASE64Decoder();byte[] afterEnBt = base64de.decodeBuffer(("AQIDBAUGBwgJAAECAwQFBvtB/OJFzVVP5Nbe/PbrhjRI5gHElu5/HpjMhNEsvVtA"));String de = decrypt(afterEnBt);System.out.println("解码后1:" + de);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static String decrypt(byte[] data) {try {Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding");SecretKeySpec keySpec = new SecretKeySpec(NomalEncrypt.key.getBytes(), "AES");// 设置偏移量参数IvParameterSpec ivSpec = new IvParameterSpec(NomalEncrypt.iv);cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] encryped = cipher.doFinal(data);byte[] decrypted=new byte[data.length-16];System.arraycopy(encryped, 16, decrypted, 0, encryped.length-16);return new String(decrypted, "utf-8");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}}}

DES解密代码为:

package .security.de;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;public class DesDecrypter {public static void main(String[] args) {try {String privateKey = "省略了私钥";byte[] enCyptedResponse = "省略了被加密后的".getBytes();String de = decrypt(enCyptedResponse, privateKey);System.out.println("解码后1:" + de);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static String decrypt(byte[] data, String key) {try {Cipher cipher = Cipher.getInstance("DESede/CBC/ISO10126Padding");// 设置偏移量参数byte[] iv=new byte[8];byte[] realData=new byte[data.length-8];System.arraycopy(data, 0, iv, 0, 8);System.arraycopy(data, 8, realData, 0, data.length-8);IvParameterSpec ivSpec = new IvParameterSpec(iv);BASE64Decoder bd = new BASE64Decoder();SecretKeySpec keySpec = new SecretKeySpec(bd.decodeBuffer(key), "DESede");cipher.init(Cipher.DECRYPT_MODE, keySpec,ivSpec);byte[] decryped = cipher.doFinal(realData);return new String(decryped, "utf-8");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}}}

RSA解密和DES加密的代码没写,偷懒了。

c# 实现RSA+AES/DES

c#是自学的,所以有些写法可能并不规范,但是还是符合语法的,所以说的不多,直接上代码。

先是AES和RSA加密:

class Encrypter{private static X509Certificate2 pubcrt =null;private static RSACryptoServiceProvider provider = new RSACryptoServiceProvider();/// <summary>/// 内容加密/// </summary>/// <param name="plainText">明文字符串</param>/// <param name="strKey">密钥</param>/// <returns>返回加密后的密文字节数组</returns>public static string ContentEncrypt(string plainText, byte[] strKey, byte[] iv){//分组加密算法SymmetricAlgorithm des = Rijndael.Create();byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组//设置密钥及密钥向量des.Key = strKey;des.IV = iv;des.Padding = PaddingMode.ISO10126;des.Mode = CipherMode.CBC;MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组cs.Close();ms.Close();byte[] finalByte = new byte[iv.Length + cipherBytes.Length];Array.Copy(iv, 0, finalByte, 0, iv.Length);Array.Copy(cipherBytes, 0, finalByte, iv.Length, cipherBytes.Length);string result = Convert.ToBase64String(finalByte);return result;}//秘钥加密public static string KeyEncrypt(String data, String certPath){try{if(pubcrt == null){pubcrt = new X509Certificate2(certPath);provider = new RSACryptoServiceProvider();String xmlStr = pubcrt.PublicKey.Key.ToXmlString(false);provider.FromXmlString(xmlStr);}byte[] encryptedData = provider.Encrypt(Encoding.Default.GetBytes(data), RSAEncryptionPadding.Pkcs1);string encryptedStr = Convert.ToBase64String(encryptedData);return encryptedStr;}catch (CryptographicException e){Console.WriteLine("加密异常" + e.Message);return null;}}

DES+RSA解密类,AES的解密可以自行研究一下,跟AES加密差不多:

class Decrypter{private static X509Certificate2 priKey = null;private static RSACryptoServiceProvider provider;//使用TripleDES解密 来处理,三倍DES解密public static string ContentDecrypt(byte[] source, byte[] key){if ((source.Length == 0) || (source == null) || (key == null) || (key.Length == 0)){throw new ArgumentNullException("Invalid Argument");}TripleDESCryptoServiceProvider dsp = new TripleDESCryptoServiceProvider();dsp.Mode = CipherMode.CBC;dsp.Padding = PaddingMode.ISO10126;//获取IVbyte[] iv = new byte[8];byte[] realsource = new byte[source.Length - 8];Array.Copy(source, 0, iv, 0, 8);Array.Copy(source, 8, realsource, 0, realsource.Length);ICryptoTransform des = dsp.CreateDecryptor(key, iv);//开始解密byte[] ret = des.TransformFinalBlock(realsource, 0, realsource.Length);return Encoding.UTF8.GetString(ret);}//秘钥解密public static string KeyDecrypt(string strKey,string pxfPath,string password){try{if(priKey == null){priKey = new X509Certificate2(pxfPath, password, X509KeyStorageFlags.Exportable);provider = new RSACryptoServiceProvider();String xmlStr = priKey.PrivateKey.ToXmlString(true);provider.FromXmlString(xmlStr);}byte[] decryptedData = provider.Decrypt(Convert.FromBase64String(strKey), RSAEncryptionPadding.Pkcs1);string decryptedStr = Convert.ToBase64String(decryptedData);return decryptedStr;}catch (CryptographicException e){Console.WriteLine("解密异常" + e.Message);return null;}}}

小结

不得不佩服那些自己设计算法和在编程语言里实现算法的牛人,不然我们也没得这么方便的使用,c#初学,连搞个动态链接库都花了很久时间,但学起来还是蛮有意思的,跟java有很多共通之处,感谢互联网其它前辈。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。