为什么RSA加密可以使用C#和Java返回不同的结果?
I使用:为什么RSA加密可以使用C#和Java返回不同的结果?,c#,java,rsa,C#,Java,Rsa,I使用: KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS ); m_KeyPair = keyGen.genKeyPair(); m_PublicKey = KeyFactory.getInstance("RSA").generatePublic( newX509EncodedKeySpec(m_KeyPair.getPu
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS );
m_KeyPair = keyGen.genKeyPair();
m_PublicKey = KeyFactory.getInstance("RSA").generatePublic(
newX509EncodedKeySpec(m_KeyPair.getPublic().getEncoded()));
byte[] exponent = m_PublicKey.getPublicExponent().toByteArray();
byte[] modulus = m_PublicKey.getModulus().toByteArray(); // then sending...
// Recieved...
m_ExternKey = new RSAParameters();
m_ExternKey.Exponent = exponent;
m_ExternKey.Modulus = modulus;
m_RsaExtern = new RSACryptoServiceProvider();
m_RsaExtern.ImportParameters(m_ExternKey);
byte[] test = m_RsaExtern.Encrypt(bytesToEncrypt, true);
- c#:RSACryptoServiceProvider
- JAVA:KeyFactory.getInstance(“RSA”)+密码
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS );
m_KeyPair = keyGen.genKeyPair();
m_PublicKey = KeyFactory.getInstance("RSA").generatePublic(
newX509EncodedKeySpec(m_KeyPair.getPublic().getEncoded()));
byte[] exponent = m_PublicKey.getPublicExponent().toByteArray();
byte[] modulus = m_PublicKey.getModulus().toByteArray(); // then sending...
// Recieved...
m_ExternKey = new RSAParameters();
m_ExternKey.Exponent = exponent;
m_ExternKey.Modulus = modulus;
m_RsaExtern = new RSACryptoServiceProvider();
m_RsaExtern.ImportParameters(m_ExternKey);
byte[] test = m_RsaExtern.Encrypt(bytesToEncrypt, true);
C#按键接收:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize( Config.CRYPTO_KEY_NUM_BITS );
m_KeyPair = keyGen.genKeyPair();
m_PublicKey = KeyFactory.getInstance("RSA").generatePublic(
newX509EncodedKeySpec(m_KeyPair.getPublic().getEncoded()));
byte[] exponent = m_PublicKey.getPublicExponent().toByteArray();
byte[] modulus = m_PublicKey.getModulus().toByteArray(); // then sending...
// Recieved...
m_ExternKey = new RSAParameters();
m_ExternKey.Exponent = exponent;
m_ExternKey.Modulus = modulus;
m_RsaExtern = new RSACryptoServiceProvider();
m_RsaExtern.ImportParameters(m_ExternKey);
byte[] test = m_RsaExtern.Encrypt(bytesToEncrypt, true);
问题是加密的字节是不同的
谢谢。RSA Encription不能使用simular密钥返回不同的值,这是它的标准化算法。检查您的密钥。如果我没记错的话,RSA参数包含的参数比模和指数多。您需要完全初始化rsa参数才能获得正确的加密(在.net中)
此外,您的私钥和私钥甚至没有在.net中设置。RSA加密是随机的。对于给定的公钥和消息,每次尝试加密都会产生一个不同的字节序列。这是正常的,也是意料之中的;随机字节作为填充阶段的一部分被注入,不注入随机字节将导致加密系统薄弱。在解密过程中,填充字节将被定位并删除,原始消息将毫发无损地恢复
因此,使用Java和C#可以得到不同的加密消息,但如果您运行Java或C#代码两次,也可以得到不同的加密消息。我希望这对C#lough代码有所帮助
byte[] rsaExp = rsaParameters.Exponent.ToByteArray();
byte[] Modulus = rsaParameters.Modulus.ToByteArray();
// Microsoft RSAParameters modulo wants leading zero's removed so create new array with leading zero's removed
int Pos = 0;
for (int i = 0; i < Modulus.Length; i++)
{
if (Modulus[i] == 0)
{
Pos++;
}
else
{
break;
}
}
byte[] rsaMod = new byte[Modulus.Length - Pos];
Array.Copy(Modulus, Pos, rsaMod, 0, Modulus.Length - Pos);
byte[]rsaExp=rsapameters.index.ToByteArray();
字节[]模数=rsapameters.modules.ToByteArray();
//Microsoft RSA参数模块希望删除前导零,因此请在删除前导零的情况下创建新阵列
int Pos=0;
对于(int i=0;i<模数长度;i++)
{
if(模数[i]==0)
{
Pos++;
}
其他的
{
打破
}
}
字节[]rsaMod=新字节[module.Length-Pos];
数组.Copy(模数,Pos,rsaMod,0,模数.长度-Pos);
是的,但正如我所知,RSA只需要公开指数和模来加密。其他参数用于解密。理论上,是的,但实现可能需要更多。我会尝试使用包含私钥的证书并使用该证书进行加密。+1我没有尝试过,但我也非常确定随机填充会导致这种情况。通常,在RSA加密之前添加随机数据填充(请参阅pkcs#1,OAEP)。