Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
为什么Java中的RSA加密产生的密文长度与C不同#_Java_C#_Encryption_Rsa - Fatal编程技术网

为什么Java中的RSA加密产生的密文长度与C不同#

为什么Java中的RSA加密产生的密文长度与C不同#,java,c#,encryption,rsa,Java,C#,Encryption,Rsa,我使用随机生成的密钥对一些文本进行加密,然后使用私钥对该密钥进行加密,以便将其上载到数据库 使用Java中的KeyPairGenerator生成RSA密钥,并将其保存为文件。使用File.ReadAllBytes()读取密钥 当我在Java中执行此操作时,一切都能正常工作,加密密钥总是172字节,但当我在C中执行此操作时,加密密钥总是844字节。我很确定文本是使用AES正确加密的,但是RSA加密出了问题 我检查了Java和C#中的键大小,它们总是匹配的。从字面上看,我能看到的唯一区别是RSA加密

我使用随机生成的密钥对一些文本进行加密,然后使用私钥对该密钥进行加密,以便将其上载到数据库

使用
Java
中的
KeyPairGenerator
生成
RSA
密钥,并将其保存为文件。使用
File.ReadAllBytes()
读取密钥

当我在Java中执行此操作时,一切都能正常工作,加密密钥总是
172字节
,但当我在
C
中执行此操作时,加密密钥总是
844字节
。我很确定文本是使用
AES
正确加密的,但是
RSA
加密出了问题

我检查了Java和C#中的键大小,它们总是匹配的。从字面上看,我能看到的唯一区别是RSA加密的密文长度,这使得数据无法使用。我相信这和填充物有关,但我不知道如何修复它

Java

公共字符串加密文本(字符串消息,私钥)
抛出NoSuchAlgorithmException,NoSuchPaddingException,
不支持编码异常,非法块大小异常,
BadPaddingException,InvalidKeyException{
键发生器;
this.cipher.init(cipher.ENCRYPT_MODE,key);//先前使用this.cipher=cipher.getInstance(“RSA”)初始化密码;
试一试{
生成器=KeyGenerator.getInstance(AES);
generator.init(128);//AES密钥大小(以位为单位)
SecretKey secKey=generator.generateKey();
Cipher AESChipher=Cipher.getInstance(AES);
aesciper.init(Cipher.ENCRYPT_模式,secKey);
字符串encText=Base64.getEncoder().encodeToString(aesciper.doFinal(msg.getBytes(“UTF-8”));
字符串encKey=Base64.getEncoder().encodeToString(cipher.doFinal(secKey.getEncoded());
返回“(“+encText+”)+encKey;
}捕获(NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
C#

公共字符串加密文本(字节[]privateKeyBytes,字符串消息)
{
尝试
{
RSACryptoServiceProvider RSA=新的RSACryptoServiceProvider();
rsacameters RSAKeyInfo=RSA.ExportParameters(false);
RSAKeyInfo.module=privateKeyBytes;
RSA.ImportParameters(RSAKeyInfo);
RijndaelManaged aes=新的RijndaelManaged();
aes.BlockSize=128;
aes.KeySize=128;
aes.Mode=CipherMode.ECB;
字节[]keycenerated=aes.Key;
字符串keyStr=Convert.ToBase64String(keycenerated);
字节[]keyArr=Convert.FromBase64String(keyStr);
byte[]KeyArrBytes16Value=新字节[16];
数组.Copy(keyArr,KeyArrBytes16Value,16);
aes.Key=KeyArrBytes16Value;
ICryptoTransform encrypto=aes.CreateEncryptor();
字节[]明文字节=ascienceoding.UTF8.GetBytes(msg);
byte[]CipherText=encrypto.TransformFinalBlock(plainTextByte,0,plainTextByte.Length);
字符串encText=Convert.tobase64字符串(密文);
string encKey=Convert.ToBase64String(RSA.Encrypt(aes.Key,true));
返回“(“+encText+”)+encKey;
}
捕获(加密异常)
{
Console.WriteLine(“失败:+e.Message”);
}
返回null;
}
更新
感谢Henno指出问题出在我如何阅读钥匙上。我最终使用Bouncy Castle来处理C#中的RSA加密。我还将java代码更改为使用公钥而不是私钥进行加密

新C#

publicstringencryptext(byte[]keyBytes,stringmsg)
{
尝试
{
AsymmetricKeyParameter AsymmetricKeyParameter=PublicKeyFactory.CreateKey(keyBytes);
RsaKeyParameters RsaKeyParameters=(RsaKeyParameters)asymmetricKeyParameter;
RSAPERAMETERS RSAPERAMETERS=新的RSAPERAMETERS();
rsacameters.module=rsaKeyParameters.module.ToByteArrayUnsigned();
rsacameters.Exponent=rsaKeyParameters.Exponent.ToByteArrayUnsigned();
RSACryptoServiceProvider rsa=新的RSACryptoServiceProvider();
rsa.输入参数(rsa参数);
RijndaelManaged aes=新的RijndaelManaged();
aes.BlockSize=128;
aes.KeySize=128;
aes.Mode=CipherMode.ECB;
字节[]keycenerated=aes.Key;
字符串keyStr=Convert.ToBase64String(keycenerated);
字节[]keyArr=Convert.FromBase64String(keyStr);
byte[]KeyArrBytes16Value=新字节[16];
数组.Copy(keyArr,KeyArrBytes16Value,16);
aes.Key=KeyArrBytes16Value;
ICryptoTransform encrypto=aes.CreateEncryptor();
字节[]明文字节=ascienceoding.UTF8.GetBytes(msg);
byte[]CipherText=encrypto.TransformFinalBlock(plainTextByte,0,plainTextByte.Length);
字符串encText=Convert.tobase64字符串(密文);
string encKey=Convert.ToBase64String(rsa.Encrypt(aes.Key,false));
返回“(“+encText+”)+encKey;
}
捕获(加密异常)
{