当前位置: 首页 > 知识库问答 >
问题:

Java AES 128加密与openssl不同

红富
2023-03-14

我们遇到了一个奇怪的情况,我们在Java中使用的加密方法产生了与openssl不同的输出,尽管它们在配置上看起来相同。

使用相同的键和IV,文本“敏捷的棕色狐狸跳过懒惰的狗!”加密到base64的字符串。。。

openssl:A8cMRIrDVnBYj2 XEKaMOBQ1sufjptsAf58slR373JTeHGPWyRqJK UQxvJ1B/1L

Java:A8cMRIrDVnBYj2 XEKaMOBQ1sufjptsAf58slR373JTEVySz5yJLGzGd7qsAkzuQ

#!/bin/bash

keySpec="D41D8CD98F00B2040000000000000000"
ivSpec="03B13BBE886F00E00000000000000000"
plainText="The quick BROWN fox jumps over the lazy dog!"

echo "$plainText">plainText

openssl aes-128-cbc -nosalt -K $keySpec -iv $ivSpec -e -in plainText -out cipherText

base64 cipherText > cipherText.base64

printf "Encrypted hex dump = "
xxd -p cipherText | tr -d '\n'

printf "\n\n"

printf "Encrypted base64 = "
cat cipherText.base64
private static void runEncryption() throws Exception
{
    String plainText = "The quick BROWN fox jumps over the lazy dog!";

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    SecretKeySpec keySpec = new SecretKeySpec(hexToBytes("D41D8CD98F00B2040000000000000000"), 0, 16, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(hexToBytes("03B13BBE886F00E00000000000000000"));

    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
    byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));

    String encryptedHexDump = bytesToHex(encrypted);
    String encryptedBase64 = new String(DatatypeConverter.printBase64Binary(encrypted));

    System.out.println("Encrypted hex dump = " + encryptedHexDump);
    System.out.println("");
    System.out.println("Encrypted base64 = " + encryptedBase64);
}

private static byte[] hexToBytes(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;
}

final protected static char[] hexArray = "0123456789abcdef".toCharArray();

public static String bytesToHex(byte[] bytes)
{
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++)
    {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}
Encrypted hex dump = 03c70c448ac35670588f6f9710a68c381435b2e7e3a6db007f9f2c951dfbdc94de1c63d6c91a892be510c6f27507fd4b

Encrypted base64 = A8cMRIrDVnBYj2+XEKaMOBQ1sufjptsAf58slR373JTeHGPWyRqJK+UQxvJ1B/1L
Encrypted hex dump = 03c70c448ac35670588f6f9710a68c381435b2e7e3a6db007f9f2c951dfbdc94c45724b3e7224b1b319deeab00933b90

Encrypted base64 = A8cMRIrDVnBYj2+XEKaMOBQ1sufjptsAf58slR373JTEVySz5yJLGzGd7qsAkzuQ

我们错过了什么明显的东西吗?还是有一些隐藏的复杂性?

共有3个答案

柳玄裳
2023-03-14

出现这些差异的原因有几个:

>

因此,为了从Java获得与从OpenSSL相同的输出,您需要在结果前添加以下内容:

byte[] rawEncryptedInput = cipher.doFinal(input.getBytes());
byte[] encryptedInputWithPrependedSalt = ArrayUtils.addAll(ArrayUtils.addAll(
            "Salted__".getBytes(), SALT), rawEncryptedInput);
return Base64.getEncoder()
            .encodeToString(encryptedInputWithPrependedSalt);
笪烨
2023-03-14

这确实是一个提供字符串或文件的问题。如果在Java代码的末尾加上“\n”,结果将与openSSL中的结果相同。

冀啸
2023-03-14

我相信区别在于填充,而不是实际的加密数据。

你试过解密字符串吗?

我相信他们也会出现。

为什么填充不同?因为它们要么以不同的方式实现,要么因为一个提供了一个文件,而另一个提供了一个字符串,最后,当你读取它们时,它们不是同一件事(例如,一个有一个EoF标记)。

顺便说一句:因为它是CBC,密码区块链,整个最后一个区块都受到这个填充差异的影响

 类似资料:
  • 问题内容: 我们遇到了一种奇怪的情况,尽管我们在Java中使用的加密方法在配置上看起来完全相同,但它们生成的输出却与openssl不同。 使用相同的键和IV,文本“快速的棕狐狸跳过了懒狗!” 加密为base64的字符串… openssl: Java: 这是我们的openssl电话… 这是我们的Java … oopenssl输出 Java输出 我们缺少明显的东西吗?还是存在一些隐藏的复杂性? 问题答

  • 我正在尝试使用带有相同密钥和 iv 的 AES 加密相同的文本。我使用 bash 方法和 ruby 的 openssl stdlib,并对加密结果进行 b64 编码。但结果不同!我试图理解为什么。这是我所做的: 红宝石(1.9.3-p448) 砰砰�� -iv参数设置为上面计算的iv_hex值。 ========================================= 我仔细检查了静脉注

  • 目前,我正在使用以下OpenSSL命令加密敏感文件: 以及解密: 到目前为止,这一切都很好,但由于我对加密和密码学没有太多经验,所以我想了解一下这是否是最好的方法。 我是否正确加密/解密文件?这样我是否充分利用了AES-256?我是否在这里做了一些可能会影响加密文件安全性的错误操作? 非常感谢评论/回复。 丹尼尔。 PS:我不太确定这是属于超级用户还是stackoverflow,请告知。

  • 问题内容: 我正在写一种加密会话密钥的方法。它需要这样做,以便可以通过已成功测试的其他程序解密密钥。解密程序无法更改。我受困的是使我的加密工作与解密例程保持一致。 首先让我给出解密例程。请记住,这不能改变: 这是我正在编写的加密例程。我生成base64编码的文本,但最终无法解密。值得注意的是,我已验证解密例程正确获取了加密例程的结果(两者之间没有握手问题)。 我真的被卡住了。任何帮助表示赞赏。谢谢

  • 我目前正在尝试使用OpenSSL加密二进制文件(它是项目的一部分,必须使用OpenSSL)。我设法安装了OpenSSL并将其与Visual Studio 2010链接。 在完成我的程序时,我没有得到任何带下划线的错误,但是在编译时,我得到了以下结果 有人知道如何解决这个错误吗?

  • 我尝试使用加密与Openenssl,但似乎我的输出不是我所期望的。我使用的密钥和测试向量取自http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors#aes-ecb-256 我的意见如下: 例如,我使用作为测试向量。 我出局了。bin为: 而不是: 我的问题是我是否用错了Openssl,或者是什么