Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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的Rinjdael加密中获得正确的密钥和IV_Java_Vb.net_Encryption_Rijndael - Fatal编程技术网

如何在JAVA的Rinjdael加密中获得正确的密钥和IV

如何在JAVA的Rinjdael加密中获得正确的密钥和IV,java,vb.net,encryption,rijndael,Java,Vb.net,Encryption,Rijndael,我在VB.Net中有一个带有Rijndael加密算法的代码: 公共函数DesencriptarCertificado(ByVal pCertificado作为字符串,ByVal pClave作为字符串)作为字节() Dim ByteCertificAdodeDescriptado As Byte()=无 作为对称算法的Dim算法=新RijndaelManaged() Dim CertClaveDesencriptada As String=“” CertClaveDesencriptada=De

我在VB.Net中有一个带有Rijndael加密算法的代码:

公共函数DesencriptarCertificado(ByVal pCertificado作为字符串,ByVal pClave作为字符串)作为字节()
Dim ByteCertificAdodeDescriptado As Byte()=无
作为对称算法的Dim算法=新RijndaelManaged()
Dim CertClaveDesencriptada As String=“”
CertClaveDesencriptada=DesencriptarString(pClave,“”)
变换(CertClaveDesencriptada,Algoritmo)
将ICryptoTransform设置为ICryptoTransform=Algoritmo.CreateDecryptor()
字节认证ADODescriptado=十六字节(pCertificado)
ByteCertificAdodescriptado=ICryptoTransform.TransformFinalBlock(ByteCertificAdodescriptado,0,ByteCertificAdodescriptado.Length)
返回字节证书ADODescriptado
端函数
公共子变换(ByVal pClave作为字符串,ByRef pAlgoritmo作为对称算法)
Dim bytes As Byte()=新字节(7){}
Dim BytesClave As Byte()=Encoding.ASCII.GetBytes(pClave)
整数形式的Dim长度=Math.Min(BytesClave.length,bytes.length)
对于i,作为整数=0到长度-1
字节(i)=字节数(i)
下一个
Dim键作为新的Rfc2898DeriveBytes(pClave,字节)
//ASIGNO字节A键E IV
pAlgoritmo.Key=Key.GetBytes(pAlgoritmo.KeySize\8)
pAlgoritmo.IV=key.GetBytes(pAlgoritmo.BlockSize\8)
端接头
问题是JAVA中的IV和KEY没有得到相同的字节,所以签名是不同的,如果我用VB.Net中生成的相同字节手动初始化KEY和IV,它可以完美地工作,但这当然是不可行的,因为它只适用于特定的证书,其思想是它一般工作,在一次搜索之后,我尝试了一些变体,但没有成功,我无法获得钥匙和IV,我将非常感谢任何关于这个主题的帮助

Java代码

public byte[]DesencriptarCertificado(字符串pCertificado,字符串pClave)抛出NoSuchAlgorithmException、InvalidKeySpecException、UnsupportedEncodingException、NoSuchPaddingException、InvalidAlgorithmParameterException、NoSuchProviderException、ShortBufferException、IOException、InvalidKeyException、IllegalBlockSizeException、,BadPaddingException{
试一试{
字符串CertClaveDesencriptada=DesencriptarString(pClave,“”);
////////////转化//////////////
字节[]字节=新字节[8];
byte[]BytesClave=certclavedesencriptad.getBytes();
int length=Math.min(BytesClave.length,bytes.length);
for(int i=0;i
  • 如果您的salt应该是7个字节长,如您的VB.NET代码
    Dim bytes as Byte()=New Byte(7){}
    中所示,您应该将其声明为:

    byte[] bytes = new byte[7];
    
  • 您尝试使用的
    PBEKeySpec
    的构造函数是在输出长度为1000的情况下使用request 12迭代

    你需要使用

    new PBEKeySpec(CertClaveDesencriptada.toCharArray(), bytes, 1000, 384);
    
    其中384表示32+16字节(位)


  • 像Rijndael这样的分组密码不用于数字签名。你能给出一些输入、输出和预期输出的例子吗?问题不是数字签名的Rijndael,问题是我在数据库中加密的数字签名证书的解密过程,我用Rijndael来做这件事。如果我没有进行正确的解密,则数字签名是不正确的。因此,当我使用VB代码进行解密时,它会生成一个正确的证书,但使用Java代码时,会出现一个错误。我希望获得与VB.NET代码相同的密钥和IV:如何在Java中使其等价:pAlgoritmo.KEY=KEY.GetBytes(pAlgoritmo.KeySize\8)pAlgoritmo.IV=key.GetBytes(pAlgoritmo.BlockSize\8)我对vb.net了解不多,但是
    Dim bytes As Byte()=新字节(7){}
    可能不应该是
    Byte[]bytes=新字节[8]。这正是问题所在,我必须使用新的PBEKeySpec(certclavedesencriptad.toCharArray(),bytes,1000384);构造器,这是解决方案,它工作完美,现在我;我用两种解决方案获得相同的证书。非常感谢,真的,谢谢。