OpenSSL AES/CBC 256命令输出与java代码输出不匹配

OpenSSL AES/CBC 256命令输出与java代码输出不匹配,java,encryption,openssl,cryptography,encryption-symmetric,Java,Encryption,Openssl,Cryptography,Encryption Symmetric,嗨,我正在使用openSSL命令加密和解密我的消息。现在,我希望将此命令转换为java代码,我尝试了web上提供的不同解决方案,但没有一个代码与结果匹配 下面是我的OpenSSL命令,在注释中有我的理解: key="FB4FF1BA6F1FCC1A11B8B3910342CBD3A2BEAEB8F52E8910D9B25C0C96280EEA" # Getting 16 digits from the iv.txt file and putting it into the bin head -

嗨,我正在使用openSSL命令加密和解密我的消息。现在,我希望将此命令转换为java代码,我尝试了web上提供的不同解决方案,但没有一个代码与结果匹配

下面是我的OpenSSL命令,在注释中有我的理解:

key="FB4FF1BA6F1FCC1A11B8B3910342CBD3A2BEAEB8F52E8910D9B25C0C96280EEA"

# Getting 16 digits from the iv.txt file and putting it into the bin
head -c 16 iv.txt > iv.bin

# Converting iv.bin text into the HEXA value
iv=`xxd -l 16 -p iv.bin`

# encrypt without "-a" 
openssl enc -aes-256-cbc -K $key -iv $iv -in plainKey.txt -out encryptedKey.bin

# printing encrypted results in base64 format this need to be matched with my java code.
echo "<enc>"`cat encryptedKey.bin | base64`"</enc>"

这里似乎有些错误,因为如果我将所有字节传递给keySpec,比如key.getBytes(),它会产生异常,因此我将传递16个字节,就像前面的代码一样,因此我在代码注释中也提到了这一点,请就此提出建议。谢谢。

您的代码中有几个错误

让我们假设你想做的是

 openssl enc -aes-256-cbc -K FB4FF1BA6F1FCC1A11B8B3910342CBD3A2BEAEB8F52E8910D9B25C0C96280EEA -iv 03B13BBE886F00E00000000000000000 -base64 -in input.txt
在代码中有一些错误(wtf时刻)。我不会为您解决这些问题,但基本上:

  • 我建议使用一些普通的库(例如commons codec,…)从十六进制进行编码/解码,尽管到目前为止似乎还可以

  • 您正在使用16字节(128位)iv和密钥有效地执行AES-128。您需要使用具有密钥和iv 256位长(32字节)的AES-256。您已将这两个字节都削减到16个字节,因此它们与openssl使用的值不同

  • 主要突破点:
    IvParameterSpec ivSpec=new IvParameterSpec(hexToBytes(hextString.toString())请仔细考虑一下<代码>六字节(iv)


  • 您的代码中有几个错误

    让我们假设你想做的是

     openssl enc -aes-256-cbc -K FB4FF1BA6F1FCC1A11B8B3910342CBD3A2BEAEB8F52E8910D9B25C0C96280EEA -iv 03B13BBE886F00E00000000000000000 -base64 -in input.txt
    
    在代码中有一些错误(wtf时刻)。我不会为您解决这些问题,但基本上:

  • 我建议使用一些普通的库(例如commons codec,…)从十六进制进行编码/解码,尽管到目前为止似乎还可以

  • 您正在使用16字节(128位)iv和密钥有效地执行AES-128。您需要使用具有密钥和iv 256位长(32字节)的AES-256。您已将这两个字节都削减到16个字节,因此它们与openssl使用的值不同

  • 主要突破点:
    IvParameterSpec ivSpec=new IvParameterSpec(hexToBytes(hextString.toString())请仔细考虑一下<代码>六字节(iv)


  • 可能还有其他问题,但首先让我们使用相同的参数-您只传递16个密钥字节,实际上是在执行AES-128,其中openssl与
    AES-256-cbc
    一起使用。下一步-为什么要自己进行十六进制/字符串转换?(不是、、等。通常是问题之一。请参阅、、等。可能还有其他问题,但首先让我们使用相同的参数-您只传递16个密钥字节,您实际上是在执行AES-128,其中openssl与
    AES-256-cbc
    一起使用。接下来-为什么您自己执行十六进制/字符串转换?(不是,,,等。通常是问题之一。请参阅,,,等。关于第1点,我没有使用几个库获得相同的十六进制代码,这就是为什么我通常这样做的原因,但我会使用库,一旦我获得所需的加密结果,对于第2点,如果我增加密钥和iv的大小,我会得到错误无效密钥和这个k我使用命令$openssl enc-aes-256-cbc-k secret-P-md sha1使用openssl生成的ey请确保iv和key(它们的实际字节数组大小)都是256位(32字节)。它对我很有用。只是一个想法-你使用什么Java版本/发行版?你不需要吗?它在我的情况下也能工作,但问题是它的输出与openSSL的输出不匹配。我对openSSL和密码学不太了解。你能指导我如何获得256位iv和密钥吗?谢谢。如果你使用Oracle JRE,你需要nstall无限强度JCE策略,否则您只能使用AES-128(据我所知)。因此,也许在开始时,您可以尝试在openssl和Java中使用16字节密钥和AES-128,看看是否正确(它足够强大,不用担心)。或者您可以尝试使用BouncyCastle或OpenJDKThank安装无限强度JCE策略后,您最后的评论对我有效错误非法密钥大小消失,输出与所需输出匹配。现在我尝试BouncyCastle,以便应用程序不需要JRE更改。至于第1点,我没有得到使用几个库生成相同的十六进制代码,这就是为什么我通常这样做的原因,但一旦我获得所需的加密结果,我将使用该库,对于第2点,如果我增加密钥的大小,我将获得错误无效密钥,我将使用命令$openssl enc-aes-256-cbc-k secret-P-md sha1Please make sur生成此密钥e iv和key(它们的实际字节数组大小)都是256位(32字节)。它对我很有用。只是一个想法-你使用什么Java版本/发行版?你不需要吗?它在我的情况下也能工作,但问题是它的输出与openSSL的输出不匹配。我对openSSL和密码学不太了解。你能指导我如何获得256位iv和密钥吗?谢谢。如果你使用Oracle JRE,你需要nstall无限强度JCE策略,否则您只能使用AES-128(据我所知)。因此,也许在开始时,您可以尝试在openssl和Java中使用16字节密钥和AES-128,看看是否正确(它足够强大,不用担心)。或者您可以尝试使用BouncyCastle或OpenJDKThank安装无限强度JCE策略后,您最后的评论对我有效错误非法密钥大小消失,输出与所需输出匹配。现在我尝试BouncyCastle,以便应用程序不需要JRE更改。
     openssl enc -aes-256-cbc -K FB4FF1BA6F1FCC1A11B8B3910342CBD3A2BEAEB8F52E8910D9B25C0C96280EEA -iv 03B13BBE886F00E00000000000000000 -base64 -in input.txt