AES使用openssl命令行工具进行加密,并使用Java进行解密

AES使用openssl命令行工具进行加密,并使用Java进行解密,java,bash,encryption,cryptography,aes,Java,Bash,Encryption,Cryptography,Aes,我有一个bash脚本,它使用openssl工具进行加密 #!/bin/bash key128="1234567890123456" iv="1234567890123456" openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv 以及试图解密脚本生成的文件的Java代码 public class crypto { public static void main( String[] args )

我有一个bash脚本,它使用openssl工具进行加密

#!/bin/bash

key128="1234567890123456"
iv="1234567890123456"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
以及试图解密脚本生成的文件的Java代码

public class crypto {

    public static void main( String[] args )
    {
        try {
            File f = new File("test.enc");
            Cipher c;
            Key k;
            String secretString = "01020304050607080900010203040506";
            String ivString = "01020304050607080900010203040506";
            byte[] secret = hexStringToByteArray(secretString);
            byte[] iv = hexStringToByteArray(ivString);

            c = Cipher.getInstance("AES/CBC/PKCS5Padding");
            k = new SecretKeySpec(secret, "AES");
            c.init(Cipher.DECRYPT_MODE, k, new IvParameterSpec(iv));

            CipherInputStream cis = new CipherInputStream(new FileInputStream(f), c);
            BufferedReader br = new BufferedReader(new InputStreamReader(cis));

            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
            br.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } catch (NoSuchAlgorithmException e) {
            System.out.println(e.getMessage());
        } catch (NoSuchPaddingException e) {
            System.out.println(e.getMessage());
        } catch (InvalidKeyException e) {
            System.out.println(e.getMessage());
        } catch (InvalidAlgorithmParameterException e) {
            System.out.println(e.getMessage());
        }

    }

    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }
}
                                                            33,1          71%
公共类加密{
公共静态void main(字符串[]args)
{
试一试{
文件f=新文件(“test.enc”);
密码c;
键k;
字符串secretString=“01020304050607080900010203040506”;
字符串ivString=“01020304050607080900010203040506”;
字节[]secret=hexStringToByteArray(secretString);
字节[]iv=hexStringToByteArray(ivString);
c=Cipher.getInstance(“AES/CBC/PKCS5Padding”);
k=新的保密密钥规范(机密,“AES”);
c、 init(Cipher.DECRYPT_模式,k,新的IvParameterSpec(iv));
CipherInputStream cis=新的CipherInputStream(新文件输入流(f),c);
BufferedReader br=新的BufferedReader(新的InputStreamReader(cis));
弦线;
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
br.close();
}捕获(IOE异常){
System.out.println(e.getMessage());
}捕获(无算法异常){
System.out.println(e.getMessage());
}捕获(无此填充例外){
System.out.println(e.getMessage());
}捕获(InvalidKeyException e){
System.out.println(e.getMessage());
}捕获(无效算法参数异常e){
System.out.println(e.getMessage());
}
}
公共静态字节[]hexStringToByteArray(字符串s){
int len=s.length();
字节[]数据=新字节[len/2];
对于(int i=0;idata[i/2]=(byte)((Character.digit(s.charAt(i),16)作为上面提到的@polyman,bash脚本和Java代码之间的键和iv不匹配。将bash脚本更改为以下解决了问题

#!/bin/bash

key128="01020304050607080900010203040506"
iv="01020304050607080900010203040506"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
如果openssl以以下方式执行,它将使用密码,并打印使用的密钥和iv。该密钥和iv可以在上面的Java程序中替换

openssl enc -nosalt -aes-128-cbc -in test -out test.enc -p

首先,
1234567890123456
0x0102030400506070708090001003040506
不同。你的IV也是如此。openssl将每个字符视为一个十六进制值,而Java代码看的是一对字符。是的,0x12与0x0102不同。你说得对,谢谢。我很惊讶openssl没有抱怨我是u只为密钥和iv唱64位。如果您很幸运,在使用错误的密钥/iv加密后获得了有效的PKCS#5填充,那会很有趣。如果您更改纯文本(例如在IOException中包装的填充相关异常),是否会得到任何输出使用提供完整性/真实性的东西来解决此类问题!非常好的帖子,谢谢。我正在努力让openssl blowfish加密工作,然后在Java中进行解密,这真的很有帮助。也许我没有做正确的事情,但是对于特定版本的aes,密钥不是太大了吗?密钥会被截断吗?我使用了t密钥大小,我收到不同的密码文本。