前面已经把使用OpenSSL.Net环境准备好了,现在来调用几个常用算法的实现
- MD5,SHA1
在这只需要注意下OpenSSL.Crypto.MessageDiges后面签名算法会用到。
1 class Program_Hash 2 { 3 static void Main(string[] args) 4 { 5 var ciphertext = MD5("Md5加密。", Encoding.UTF8); 6 ciphertext = SHA1("SHA1加密。", Encoding.UTF8); 7 } 8 9 public static string MD5(string text, Encoding encoding)10 {11 return HashDigest(text, encoding, MessageDigest.MD5);12 }13 14 public static string SHA1(string text, Encoding encoding)15 {16 return HashDigest(text, encoding, MessageDigest.SHA1);17 }18 19 private static string HashDigest(string text, Encoding encoding, MessageDigest hashType)20 {21 using (MessageDigestContext hashDigest = new MessageDigestContext(hashType))22 {23 byte[] hashBytes = encoding.GetBytes(text);24 byte[] signByte = hashDigest.Digest(hashBytes);25 return BitConverter.ToString(signByte).Replace("-", "").ToLower();26 }27 }28 }
- AES
1、在这里SymmetricCrypt是之前项目封装的System.Security.Cryptography.RijndaelManaged
2、Key与IV是有其规律的因此IV是可以去掉
3、在string与byte[]之间转换时要注意编码,什么时候用Convert.FromBase64String,什么时候用Encoding
4、可以查看下Cipher封装,里面有不同的算法
1 class Program_Symmetric 2 { 3 static void Main(string[] args) 4 { 5 SymmetricCrypt symmetric = new SymmetricCrypt(CryptType.Rijndael); 6 string key = "PGKQBXNCiuwKmlIUThSy1h+ZHMAN+HytbZny/FepkvM=", 7 iv = "aqauVvyO7qvAbaDsdOeFsA==", 8 text = "AES256加解密。"; 9 10 var ctext = symmetric.Encrypt(text, key, iv);11 12 var ctext2 = symmetric.Decrypt(ctext, key, iv);13 14 var ctext3 = Encrypt(ctext2, key, iv);15 16 Decrypt(ctext3, key, iv);17 }18 19 public static string Decrypt(string text, string key, string iv)20 {21 byte[] keyBytes = Convert.FromBase64String(key);22 byte[] ivBytes = Convert.FromBase64String(iv);23 byte[] textBytes = Convert.FromBase64String(text);24 using (CipherContext cipher = new CipherContext(Cipher.AES_256_CBC))25 {26 byte[] output = cipher.Decrypt(textBytes, keyBytes, ivBytes);27 var result = Encoding.UTF8.GetString(output);28 return result;29 }30 }31 32 public static string Encrypt(string text, string key, string iv)33 {34 byte[] keyBytes = Convert.FromBase64String(key);35 byte[] ivBytes = Convert.FromBase64String(iv);36 byte[] textBytes = Encoding.UTF8.GetBytes(text);37 using (CipherContext cipher = new CipherContext(Cipher.AES_256_CBC))38 {39 byte[] output = cipher.Encrypt(textBytes, keyBytes, ivBytes);40 var result = Convert.ToBase64String(output);41 return result;42 }43 }44 }
- RSA
1、公钥与私钥可以用OpenSSL命令行随意生成
2、OpenSSL.Core.BIO简单理解是用于装载密钥的容器
3、注意OpenSSL.Crypto.RSA的静态方法
4、OpenSSL.Crypto.CryptoKey用于装载BIO能把密钥转换成具体的算法对象,这个类的作用很大,涉及到签名验签都会用到
1 class Program_RSA 2 { 3 static void Main(string[] args) 4 { 5 string privateKey = "", publicKey = "", text = "RSA-1024加解密。", ctext = ""; 6 int padding = 1; 7 Encoding encoding = Encoding.UTF8; 8 using (RSA rsa = new RSA()) 9 { 10 rsa.GenerateKeys(1024, BigNumber.One, null, null); 11 privateKey = rsa.PrivateKeyAsPEM; 12 publicKey = rsa.PublicKeyAsPEM; 13 } 14 15 ctext = PrivateEncrypt(privateKey, text, encoding, padding); 16 text = PublicDecrypt(publicKey, ctext, encoding, padding); 17 18 ctext = PublicEncrypt(publicKey, text, encoding, padding); 19 text = PrivateDecrypt(privateKey, ctext, encoding, padding); 20 21 var signText = Sign(privateKey, text, encoding); 22 var signTag = Verify(publicKey, text, signText, encoding); 23 24 } 25 26 ///27 /// 私钥解密 28 /// 29 public static string PrivateDecrypt(string privateKey, string text, Encoding encoding, int padding) 30 { 31 byte[] textBytes = Convert.FromBase64String(text); 32 using (BIO bio = new BIO(privateKey)) 33 { 34 using (RSA rsa = RSA.FromPrivateKey(bio)) 35 { 36 textBytes = rsa.PrivateDecrypt(textBytes, (RSA.Padding)padding); 37 } 38 } 39 return encoding.GetString(textBytes); 40 } 41 42 ///43 /// 私钥加密 44 /// 45 public static string PrivateEncrypt(string privateKey, string text, Encoding encoding, int padding) 46 { 47 byte[] textBytes = encoding.GetBytes(text); 48 using (BIO bio = new BIO(privateKey)) 49 { 50 using (RSA rsa = RSA.FromPrivateKey(bio)) 51 { 52 textBytes = rsa.PrivateEncrypt(textBytes, (RSA.Padding)padding); 53 } 54 } 55 return Convert.ToBase64String(textBytes); 56 } 57 58 ///59 /// 公钥解密 60 /// 61 public static string PublicDecrypt(string publicKey, string text, Encoding encoding, int padding) 62 { 63 byte[] textBytes = Convert.FromBase64String(text); 64 using (BIO bio = new BIO(publicKey)) 65 { 66 using (RSA rsa = RSA.FromPublicKey(bio)) 67 { 68 textBytes = rsa.PublicDecrypt(textBytes, (RSA.Padding)padding); 69 } 70 } 71 return encoding.GetString(textBytes); 72 } 73 74 ///75 /// 公钥加密 76 /// 77 public static string PublicEncrypt(string publicKey, string text, Encoding encoding, int padding) 78 { 79 byte[] textBytes = encoding.GetBytes(text); 80 using (BIO bio = new BIO(publicKey)) 81 { 82 using (RSA rsa = RSA.FromPublicKey(bio)) 83 { 84 textBytes = rsa.PublicEncrypt(textBytes, (RSA.Padding)padding); 85 rsa.Dispose(); 86 } 87 bio.Dispose(); 88 } 89 return Convert.ToBase64String(textBytes); 90 } 91 92 ///93 /// 私钥签名 94 /// 95 public static string Sign(string privateKey, string text, Encoding encoding) 96 { 97 using (BIO bio = new BIO(privateKey)) 98 { 99 using (CryptoKey cryptoKey = CryptoKey.FromPrivateKey(bio, null))100 {101 using (MessageDigestContext sha256 = new MessageDigestContext(MessageDigest.SHA256))102 {103 byte[] msgByte = encoding.GetBytes(text);104 byte[] signByte = sha256.Sign(msgByte, cryptoKey);105 return Convert.ToBase64String(signByte);106 }107 }108 }109 }110 111 ///112 /// 公钥验签113 /// 114 public static bool Verify(string publicKey, string text, string sign, Encoding encoding)115 {116 using (BIO bio = new BIO(publicKey))117 {118 using (CryptoKey cryptoKey = CryptoKey.FromPublicKey(bio, null))119 {120 using (MessageDigestContext sha256 = new MessageDigestContext(MessageDigest.SHA256))121 {122 byte[] msgByte = encoding.GetBytes(text);123 byte[] signByte = Convert.FromBase64String(sign);124 return sha256.Verify(msgByte, signByte, cryptoKey);125 }126 }127 }128 }129 }