.NET的那种RSA加解密算法能与JAVA的RSA加解密的保持一致?
.NET的RSA加密
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
/// <summary>
/// RSA 私钥加密
/// </summary>
/// <param name="data">数据</param>
/// <param name="key">私钥</param>
/// <returns></returns>
public byte[] RSAEncryptByPrivate(byte[] data, byte[] key)
{
try
{
//java: PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
//java: KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//java: PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
AsymmetricKeyParameter Privatekey = PrivateKeyFactory.CreateKey(key);
//java: Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
IBufferedCipher c = CipherUtilities.GetCipher("RSA");
//java: cipher.init(Cipher.ENCRYPT_MODE, privateKey);
c.Init(true, Privatekey);
//java: return cipher.doFinal(data);
return c.DoFinal(data);
}
catch
{
return null;
}
}
JAVA的算法
public static byte[] encryptByPrivateKey(byte data[], byte key[])
throws Exception
{
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
java.security.PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(1, privateKey);
return cipher.doFinal(data);
}
这两个RSA加密的方法加密的结果就是不一样.晕死.
参数data的Bse64:
vFI598yiPhn7qhXpJI97aw==
参数key的Base64:
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKAAnRDlrJiwi34p
b3neOugwuDcruadpkvW84fJY1rS3U1DM69JoAM+v1UwcMIXSBvtGhUNjZHswFP3P
YXtB5I61fV2zOi7UZ09FS38JVaTt65Ju/uxGqu+oYleiRuR/ehn89mChxo8WUMi3
9NOvkxPdjLKWCMcEpffpR6RFTOqzAgMBAAECgYB2eB3T3gsOv2F5l5qHxKkfNLuh
dgmv0HbU5vbxZyAKjNbus9xEXWeEX6/x+8ldvGYY9V1EyTokEDTqvPtztRVR/Y6G
ptBzycEckuu6oCJoecNMfzvmIueDNf4uI8VYyvntPedQZ6oICXHkrCNeuJ+jZQGm
L8oFeDJmaPdVZUdu2QJBAMu5eEAPC2RVvvSvhAj48sOsRDAH6bMOjxkkT3YIqMBe
O8tcUnPTJlIX7Vr1gGH6Ubgw3gNnbKvGAkVF46UASUcCQQDJDxFR+p2CbwEEnLtk
02T58zgYln2Nd3J5ERfpCMW+qXLrgxgecCtAB+4YzI8KA5RKweb6Jcp+0V/ea4Qy
I8k1AkBpWs0ZM66MgNtz5qC9kyDYmGna/PyaoNjYA7MkM24xrYn2rRPm2jdjFQSm
mXd/M9i3DG6EDCRi4M+jy3Tii7dZAkB8J07FtaEPyyXwyCu7bgI7imIIZN1wvuK0
OcbvApjBTHeHULNTEGbUqlDvhVmKkH1A0I2lyDJLr1SozvGZ2JlFAkAW/BUT9c+E
4RNL5W3yY1oOVpI1bQs/QCiDlZ69xVLUl56D6IOSlr09cpQH6c/hIALTq3P3JFGz
7o5JACVSuryX
.NET加密的结果Base64:
jlSBfsHvjdQ84ufHPMdDUhK6u+jVuLYmLtK5smBk28r+cZ/UQR3elP/GyJidOr8+
PF+Dbg88aHhfX9EqlL2JrQvA3DwjgYZnabKz/wLnWSJfVu5jGsNe/+TLX+QIy3ZW
ubLs8Pm/1uGFjFRWXp7rEV4ikOXwWY4AX0uNdtUdLRk=
JAVA加密的结果Base64:
Gx2KtW8fB7ctK6n3f4Q3VgB+7pZRyY2alpJpIIQTanlvh1dnUXBa6KBNyuq/X1s5
NmfWaIesA/WasL28H1qUoSgrvJK9rVzjvU6O5ayjvUlXrZ7aS6oZhrgHSK4lEqsh
tvv5RVzJwkQQxbqXR4JVfaPUSmWhzfvfb6dkpsccBNc=
为啥就是不一样呢?有什么法子能搞成一致的?.NET使用微软自带的加密更不成,那玩意儿每次结果都不同. --------------------编程问答-------------------- rsa每次加密结果都是不一样的 他们采用pkcs1填充方式 这没关系 只要加密后的密文能解密就可以了
具体可以看pkcs1的文档 rfc都有详细的说明 --------------------编程问答-------------------- 加密的结果是要提交给第三方JAVA服务端
如果是让C#服务端解密,也就不会有此问题了. --------------------编程问答-------------------- 求解. --------------------编程问答-------------------- 史上最低价的云计算大会门票抢购火热进行中,每日限量5张,数量有限,先到先得噢! --------------------编程问答-------------------- 、.Net环境下面对同样一个字符串用相同的RSA公钥加密,居然每次的结果不一样!而Java环境下面则每次的结果是一样的;这点就是我们此次解决互通问题的关键!究其原因是这样的:.Net为了加强RSA加密算法的安全性,在每次加密的时候都会生成一定的随机数和原始数据一起被加密,这显然不是单纯标准的RSA加密;而Java中的RSA加密是完全标准化的,不添加随机数的 --------------------编程问答--------------------
这是错误的结论。
RSA有多个补齐标准,比如PKCS#1和OAEP等,都支持随机扰动。
PKCS#1 v1.5有两种补齐不是随机(T=0和T=1),但不常用。
PKCS#1 v1.5见该帖8楼(http://bbs.csdn.net/topics/390447249)。
详细可阅读:http://en.易做图.org/wiki/RSA_(algorithm) --------------------编程问答-------------------- RSA有多个补齐标准,比如PKCS#1,这个可以与java兼容,OAEP不行。 --------------------编程问答-------------------- java也可以选填充方式的,设置这个PKCS#1就能保持和.net 一致了,虽然每次加密结果都不同,但可以互相识别。
补充:.NET技术 , C#