【问题标题】:AES encryption testing (android)AES加密测试(安卓)
【发布时间】:2014-06-17 10:54:10
【问题描述】:

我为安卓开发了一个加密程序,它使用对称密钥来加密和解密数据(AES 算法)。 因此,我被要求验证不仅逆向工程工作正常,而且只有一个密钥可用于解密数据。我发现的一项测试称为 The已知答案测试。因此使用提供的加密密钥和测试向量可以比较结果。

AES 测试向量: http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors

但是,问题在于提供的密钥和提供的数据是 HEX 格式。

所以首先我使用提供的密钥并从中创建了一个不起作用的字符串:

byte[] convertedKeyToByte = providedKey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(convertedKeyToByte , 0, convertedKeyToByte .length,
            AESalgorithm);

之后,我使用特殊方法将字符串转换为十六进制,由于十六进制转换为十六进制,该方法也不起作用。一般来说,第一种方法应该有效,但它没有。

如果我完全错了,请不要对我大喊大叫,因为我之前没有做过加密。

如何证明 AES 算法有效,以及只有一个密钥可以用于加密和解密数据?

【问题讨论】:

  • 您的问题到底是什么?将十六进制数据转换为键和字节?
  • 你所说的“逆向工程”是什么意思?您是否重新实现了 AES?如果您使用的是 Android 提供的“普通”AES 实现,则没有理由在 您的 代码上对其进行测试。
  • 逆向工程意味着可以解密加密数据。这是自动证明的。所以我被要求证明 AES alogirthm 是有效的,因此只有一个密钥可以用于加密和解密数据。这是我的要求中写的。
  • “怎么可能证明AES算法有效”很简单,加密解密,实际与预期比较。
  • “只有一个密钥可以用来加密和解密数据”这可能需要数学证明。

标签: java android unit-testing encryption


【解决方案1】:

您可以使用以下代码测试您的向量:

private static boolean testVector(String algorithm, String key, String iv,
        String vector, String ciphertext) throws GeneralSecurityException {

    Cipher c = Cipher.getInstance(algorithm);
    SecretKey k = new SecretKeySpec(DatatypeConverter.parseHexBinary(key),
            "AES");

    if (iv == null) {
        c.init(Cipher.ENCRYPT_MODE, k);
    } else {
        c.init(Cipher.ENCRYPT_MODE, k, new IvParameterSpec(
                DatatypeConverter.parseHexBinary(iv)));
    }

    byte[] result = c.doFinal(DatatypeConverter.parseHexBinary(vector));
    return Arrays.equals(result,
            DatatypeConverter.parseHexBinary(ciphertext));
}

调用示例:

public static void main(String[] args) throws Exception {
    System.out.println(testVector("AES/ECB/NoPadding",
            "2b7e151628aed2a6abf7158809cf4f3c", null,
            "6bc1bee22e409f96e93d7e117393172a",
            "3ad77bb40d7a3660a89ecaf32466ef97"));
}

您的其他问题,与解密能力和保证只有一个密钥有效有关,都是理论上的问题。您需要参考 AES 的正确性证明(没有链接,抱歉)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-13
    • 2011-03-10
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2021-05-13
    • 2011-07-10
    相关资源
    最近更新 更多