【问题标题】:IV for encryption conversion. Expected IV length of 16 but was 24IV 用于加密转换。预期 IV 长度为 16,但为 24
【发布时间】:2018-04-10 17:25:37
【问题描述】:

谁能告诉我为什么会收到此错误消息?显然这是我缺少的某种转换

预计 IV 长度为 16,但为 24

我用它来称呼它

String encrypted = "E5ADDEB05D9D7B3925B7DE16B560D87C";
String sKey = "3985661DD71D591665BD39476636486B";
String sIv = "75E5FBB56AA78D05D246078A782553E1";
String decrypted = decrypt2(encrypted, sKey, sIv);
Log.i("--------------------------------> ", decrypted);

这是程序

public static String decrypt2(final String EncryptedMessageBase64,
                              final String symKeyHex,
                              final String sIvHex) {

    final byte[] symKeyData = Base64.decode((symKeyHex),Base64.DEFAULT);
    final byte[] byIvData = Base64.decode((sIvHex), Base64.DEFAULT);
    final byte[] EncryptedMessage = Base64.decode(EncryptedMessageBase64, Base64.DEFAULT);

    try
    {

        final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        final int blockSize = cipher.getBlockSize();

        final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES");
        Log.i("### iv size -------->", String.valueOf(blockSize));
        Log.i("### symKeyHex -------->", symKeyHex);
        Log.i("### sIvHex -------->", sIvHex);
        Log.i("### blockSize -------->", String.valueOf(blockSize));

        final IvParameterSpec iv = new IvParameterSpec(byIvData);

        final byte[] encryptedMessage = new byte[EncryptedMessage.length];

        cipher.init(Cipher.DECRYPT_MODE, symKey, iv);

这是输出

### iv size -------->: 16
### symKeyHex -------->: 3985661DD71D591665BD39476636486B
### sIvHex -------->: 75E5FBB56AA78D05D246078A782553E1
### blockSize -------->: 16
error: expected IV length of 16 but was 24

【问题讨论】:

标签: android encryption aes spongycastle


【解决方案1】:

您正在对密钥和 IV 进行 Base64 解码,但它们是十六进制编码的,您需要对二进制进行十六进制解码。

symKeyHexsIvHex 是非常清晰的十六进制编码值,EncryptedMessageBase64 显然是 Base64 编码的。

根据您在项目中包含的库,一种可能性是:

final byte[] symKeyData = (byte[]) new Hex().decode(symKeyHex);
final byte[] byIvData   = (byte[]) new Hex().decode(sIvHex);

更多:Base64 编码将 3 个二进制字节表示为 4 个 ASCII 字符。十六进制编码表示 1 个二进制字节为 2 个 ASCII 字符。

【讨论】:

  • 你能告诉我那是不是 AES 256bit 吗?我以为是,但你现在让我想它实际上是一个 16char 键
  • 我会将其视为完全安全的 128 位(16 字节,而非字符)密钥。
  • 再次感谢,您知道将密钥从 16 字节加倍到 32 字节是否可以实现 256 位加密?就这么简单吗?
  • 基本上是的,但这样做并没有增加安全性,128 位或 256 位密钥在任何方面都不会受到攻击。好的,它可以让开发人员感觉更主要,但仅此而已。如果您要使用相同的密钥和不同的编码来创建一个 256 位密钥,那么将没有更多的安全性,因为它是相同的密钥。见Why most people use 256 bit encryption instead of 128 bit?
  • @flashc5 以下是关于将 128 位密钥扩展为 256 位密钥的信息:Does AES-128 have the same strength as AES-256 with a padded key? 非 0 的填充有同样的问题。
猜你喜欢
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2016-09-23
  • 2023-03-25
  • 2020-04-28
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多