程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Monte Carlo 测试的 AES 验证标准伪代码缺少什么?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Monte Carlo 测试的 AES 验证标准伪代码缺少什么??

开发过程中遇到Monte Carlo 测试的 AES 验证标准伪代码缺少什么?的问题如何解决?下面主要结合日常开发的经验,给出你关于Monte Carlo 测试的 AES 验证标准伪代码缺少什么?的解决方法建议,希望对你解决Monte Carlo 测试的 AES 验证标准伪代码缺少什么?有所启发或帮助;

我正在尝试在 CBC 模式下对 AES-128 使用规定的验证程序,如 the NIST AESAVS standard 中所定义。测试套件中更重要的部分之一是 Monte Carlo 测试,它提供了一种生成许多 10000 个伪随机测试用例的算法,因此硬编码电路不太可能伪造 AES。其中的算法伪代码似乎在变量范围和定义方面具有一定的自由度,因此我希望有人可以帮助我填写缺失的信息以正确解释这一点。

128位key case的逐字算法如下:

Key[0] = Key
IV[0] = IV
PT[0] = PT
For i = 0 to 99
    Output KeY[i]
    Output IV[i]
    Output PT[0]
    For j = 0 to 999
        If ( j=0 )
            CT[j] = AES(KeY[i],IV[i],PT[j])
            PT[j+1] = IV[i]
        Else
            CT[j] = AES(KeY[i],PT[j])
            PT[j+1] = CT[j-1]
    Output CT[j]
    KeY[i+1] = KeY[i] xor CT[j]
    IV[i+1] = CT[j]
    PT[0] = CT[j-1]

对于上面的伪代码,从这些初始值开始:

Key = 9dc2c84a37850c11699818605f47958c
IV = 256953b2feab2a04ae0180d8335bbed6
PT = 2e586692e647f5028ec6fa47a55a2aab

外循环的前三个迭代应该输出:

KEY = 9dc2c84a37850c11699818605f47958c
IV = 256953b2feab2a04ae0180d8335bbed6
PLAIntexT = 2e586692e647f5028ec6fa47a55a2aab
CIPHERTEXT = 1b1ebd1fc45ec43037fd4844241a437f

KEY = 86dc7555f3dbc8215e6550247b5dd6f3
IV = 1b1ebd1fc45ec43037fd4844241a437f
PLAIntexT = c1b77ed52521525f0a4ba341bdaf51d9
CIPHERTEXT = bf43583a665fa45fdee831243a16ea8f

KEY = 399f2d6f95846c7e808d6100414b3c7c
IV = bf43583a665fa45fdee831243a16ea8f
PLAIntexT = 7cbeea19157ec7bbf6289e2dff5e8ee4
CIPHERTEXT = 5464e1900f81e06f67139456da25fc09

看起来我们在内循环之外使用了 j@H_696_24@,我认为这是造成混淆的根源。我最初假设这意味着无论密文 CT@H_696_24@ 的最终值是什么 (CT[999]@H_696_24@),这将使我相信下一个外部的明文循环PT[0]@H_696_24@被初始化为CT[998]@H_696_24@。但是,这种解释与给出的预期输出不符。

我还认为,这里的括号可能不是表示一组值,而是表示相对于现在的时间步长。然而,这也使得在循环之外引用 j@H_696_24@ 变得混乱。如果循环已经结束,那么 i@H_696_24@ 还是 j@H_696_24@ 是当前时间?

我在这里遗漏了一些关键步骤吗?是否有错别字(文档中没有勘误)?

任何对此事有经验的人都可以评论适当的解释吗?

解决方法

几个月前,我试图让 AES CBC MonteCarlo 在 Java 上运行。我遇到了同样的问题,但最终我找到了一个完整且可运行的解决方案,符合官方 NIST 矢量结果。

在我开始之前 - 您的初始测试向量似乎是一个自己的向量,但不是 NIST 提供的向量 - 这里是包含所有 AES 测试向量的 NIST 官方网站的链接:

NIST 网站:https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/Block-Ciphers 蒙特卡洛测试向量:https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/aes/aesmct.zip

我的测试将从这些数据开始:

[ENCRYPT]
COUNT = 0
KEY = 8809e7dd3a959ee5d8dbb13f501f2274
IV = e5c0bb535d7d54572ad06d170a0e58ae
PLAIntexT = 1fd4ee65603e6130cfc2a82ab3d56c24
CIPHERTEXT = b127a5b4c4692d87483db0c3b0d11e64

并且该函数对内循环和外循环使用“双”字节数组。我没有在 SO 上提供完整的源代码,但完整的代码可以在我的 GitHub 存储库 https://github.com/java-crypto/Known_Answer_Tests 中找到,其中包含许多其他测试和测试向量文件。加密/解密必须使用 NoPadding 完成 - 不要像大多数情况那样在默认模式下使用 AES 使用 PKCS#5/#7 填充运行的情况。

如果您愿意,可以在此处在线运行代码(简化为 AES CBC 128 MonteCarlo):https://repl.it/@javacrypto/AesCbcMonteCarloTest#Main.java

程序将运行完整的加密和解密测试,并进行额外的交叉检查(即对加密结果进行检查 通过解密,反之亦然)。

因为我是几个月前处理这个问题的,所以我只是用 Java 代码提供我的解决方案 - 希望它可以帮助你 您对 NIST 测试程序的了解。

public static byte[] aes_cbc_mct_encrypt(byte[] PLAIntexT,byte[] KEYinit,byte[] IVinit) throws Exception {
    int i = 0; // outer loop
    int j = 0; // inner loop
    byte[][] KEY = new byte[101][128];
    byte[][] IV = new byte[1001][128];
    byte[][] PT = new byte[1001][128]; // plaintext
    byte[][] CT = new byte[1001][128]; // ciphertext
    byte[] CTsave = new byte[256]; // nimmt den letzten ct fuer nutzung als neuen iv auf
    // init
    int KEYLENGTH = KEYinit.length * 8;
    KEY[0] = KEYinit;
    IV[0] = IVinit;
    PT[0] = PLAIntexT;
    for (i = 0; i < 100; i++) {
        for (j = 0; j < 1000; j++) {
            if (j == 0) {
                CT[j] = aes_cbc_encrypt(PT[j],KEY[i],IV[i]);
                CTsave = CT[j]; // sicherung fuer naechsten iv
                PT[j + 1] = IV[i];
            } else {
                IV[i] = CTsave;
                CT[j] = aes_cbc_encrypt(PT[j],IV[i]);
                CTsave = CT[j];
                PT[j + 1] = CT[j - 1];
            }
        }
        j = j - 1; // correction of loop counter
        if (KEYLENGTH == 128) {
            KEY[i + 1] = xor(KEY[i],CT[j]);
        }
        if (KEYLENGTH == 192) {
            KEY[i + 1] = xor192(KEY[i],CT[j - 1],CT[j]);
        }
        if (KEYLENGTH == 256) {
            KEY[i + 1] = xor256(KEY[i],CT[j]);
        }
        IV[i + 1] = CT[j];
        PT[0] = CT[j - 1];
        ctCalculated[i] = CT[j].clone();
    }
    return CT[j];
}

public static byte[] xor(byte[] a,byte[] b) {
    // nutzung in der mctCbcEncrypt und mctCbcDecrypt methode
    byte[] result = new byte[Math.min(a.length,b.length)];
    for (int i = 0; i < result.length; i++) {
        result[i] = (bytE) (((int) a[i]) ^ ((int) b[i]));
    }
    return result;
}

public static byte[] aes_cbc_encrypt(byte[] plaintextByte,byte[] keyByte,byte[] initvectorBytE) throws NoSuchAlgorithmException,NoSuchPaddingException,InvalidKeyException,InvalidAlgorithmParameterException,BadPaddingException,IllegalBlockSizeException {
    byte[] ciphertextByte = null;
    SecretKeySpec keySpec = new SecretKeySpec(keyByte,"AES");
    IvParameterSpec ivKeySpec = new IvParameterSpec(initvectorBytE);
    Cipher aesCipherEnc = Cipher.geTinstance("AES/CBC/NOPADDING");
    aesCipherEnc.init(Cipher.ENCRYPT_MODE,keySpec,ivKeySpec);
    ciphertextByte = aesCipherEnc.doFinal(plaintextBytE);
    return ciphertextByte;
}

大佬总结

以上是大佬教程为你收集整理的Monte Carlo 测试的 AES 验证标准伪代码缺少什么?全部内容,希望文章能够帮你解决Monte Carlo 测试的 AES 验证标准伪代码缺少什么?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:测试的