C#加密的RSA密文无法被PHP解密 这就不是我们想要的了。
首先java的byte的范围是-128~127,而.net的范围是0-255。
我们可以调整下net的范围
C#代码:
/// <summary> /// RSA加密+base64 /// </summary> /// <param name="publickey">公钥</param> /// <param name="content">原文</param> /// <returns>加密后的密文字符串</returns> public static string RSAEncrypt(string publickey, string content) { //最大文件加密块 int MAX_ENCRYPT_BLOCK = 245; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(publickey); byte[] contentByte = Encoding.UTF8.GetBytes(content); int inputLen = contentByte.Length; int offSet = 0; byte[] cache; int i = 0; System.IO.MemoryStream aMS = new System.IO.MemoryStream(); // 对数据分段加密 while (inputLen - offSet > 0) { byte[] temp = new byte[MAX_ENCRYPT_BLOCK]; if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { Array.Copy(contentByte, offSet, temp, 0, MAX_ENCRYPT_BLOCK); cache = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); } else { Array.Copy(contentByte, offSet, temp, 0, inputLen - offSet); cache = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); } aMS.Write(cache, 0, cache.Length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } cipherbytes = aMS.ToArray(); return Convert.ToBase64String(cipherbytes); } /// <summary> /// RSA解密 /// </summary> /// <param name="privatekey">私钥</param> /// <param name="content">密文(RSA+base64)</param> /// <returns>解密后的字符串</returns> public static string RSADecrypt(string privatekey, string content) { //最大文件解密块 int MAX_DECRYPT_BLOCK = 256; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(privatekey); byte[] contentByte = Convert.FromBase64String(content); int inputLen = contentByte.Length; // 对数据分段解密 int offSet = 0; int i = 0; byte[] cache; System.IO.MemoryStream aMS = new System.IO.MemoryStream(); while (inputLen - offSet > 0) { byte[] temp = new byte[MAX_DECRYPT_BLOCK]; if (inputLen - offSet > MAX_DECRYPT_BLOCK) { Array.Copy(contentByte, offSet, temp, 0, MAX_DECRYPT_BLOCK); cache = rsa.Decrypt(temp, false); } else { Array.Copy(contentByte, offSet, temp, 0, inputLen - offSet); cache = rsa.Decrypt(temp, false); } aMS.Write(cache, 0, cache.Length); i++; offSet = i * MAX_DECRYPT_BLOCK; } cipherbytes = aMS.ToArray(); return Encoding.UTF8.GetString(cipherbytes); }
PHP代码:
/** * 公钥加密返回加密结果 * @author apizl.com <apiziliao@gmail.com> * @param type $content * @return type */ public function publicKey($content) { $crypto = ''; $pu_key = openssl_pkey_get_public($public_key); foreach (str_split($content, 117) as $chunk) { openssl_public_encrypt($chunk, $encryptData, $pu_key); $crypto .= $encryptData; } return base64_encode($crypto); } /** * 私钥解密返回结果 * @author apizl.com <apiziliao@gmail.com> * @param type $content * @return type */ public function privateKey($content) { $crypto = ''; $pi_key = openssl_pkey_get_private($private_key); foreach (str_split(base64_decode($content), 128) as $chunk) { openssl_private_decrypt($chunk, $decryptData, $pi_key); $crypto .= $decryptData; } return $crypto; }
这样就解决了加密交互问题。
关键字词: