Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么RSA加密可以使用C#和Java返回不同的结果?_C#_Java_Rsa - Fatal编程技术网

为什么RSA加密可以使用C#和Java返回不同的结果?

为什么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

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.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”)+密码
我将公钥(指数+模)作为字节数组从java发送到c#。没关系,有相同的字节。但是,当我尝试用Java和c#中的一个密钥加密某些数据时,会得到不同的结果

Java密钥生成:

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)。