【问题标题】:Sample implementation of java CBCBlockCipherMac in Objective cObjective c 中 java CBCBlockCipherMac 的示例实现
【发布时间】:2014-06-27 17:47:32
【问题描述】:

任何人都可以分享一个关于如何在目标 C 中实现 CBCBlockCipherMac 的示例代码。这是我走了多远,它给出了与 java 实现不同的结果。

const unsigned char key[16] = "\x1\x2\x3\x4\x5\x6\x7\x8\x9\x0\x1\x2\x3\x4\x5\x6";
const unsigned char data[14] = "\x54\x68\x69\x73\x69\x73\x6d\x79\x73\x74\x72\x69\x6e\x67";

CMAC_CTX *ctx = CMAC_CTX_new();
ret = CMAC_Init(ctx, key, sizeof(key), EVP_des_ede3(), 0);


printf("CMAC_Init = %d\n", ret);

ret = CMAC_Update(ctx, data, sizeof(data));

printf("CMAC_Update = %d\n", ret);

size_t size;
//unsigned int size;
unsigned char tag[4];
ret = CMAC_Final(ctx, tag, &size);


printf("CMAC_Final = %d, size = %u\n", ret, size);

CMAC_CTX_free(ctx);

printf("expected: 391d1520\n"
       "got:      ");
size_t index;
for (index = 0; index < sizeof(tag) - 1; ++index) {
    printf("%02x", tag[index]);
    if ((index + 1) % 4 == 0) {
        printf(" ");
    }
}
printf("%02x\n", tag[sizeof(tag) - 1]);

我的java代码是这样的

String *data = "Thisismystring";
String *keyString = "1234567890123456";


bytes[]mac = new byte[4];
CBCBlockCipherMac macCipher = new CBCBlockCipherMac(DESedeEngine);
DESedeParameters keyParameter = new DESedeParameters(keyString.getBytes());
DESedeEngine engine = new DESedeEngine();
engine,init(true, keyParameter);
byte[] dataBytes = data.getBytes();
macCipher.update(dataBytes,0,data.length());
macCipher.doFinal(mac,0);
byte[] macBytesEncoded = Hex.encode(mac);
String macString = new String(macBytesEncoded);

这给了我“391d1520”。但是目标c给了我“01000000”

【问题讨论】:

  • 你能显示你得到的输出吗,多几行 Java 代码也不会伤害,只是为了和 C 代码比较?
  • @owlstead...用更多的 java 代码编辑了我的问题。谢谢
  • 我不知道01000000是什么,但它可能是MAC函数的实际输出的可能性很小,MAC函数的输出应该与随机无法区分。现在任何值都可以通过随机生成,但是将单个 1 位和 63 位设置为零,不...

标签: objective-c authentication encryption message cbc-mac


【解决方案1】:

CMAC 与 CBC MAC 不同。 CMAC 在计算的开始和结束时有一个额外的步骤。如果可能的话,我建议您升级您的 Java 代码以使用 CMAC,因为 CBC 不那么安全,例如使用org.bouncycastle.crypto.macs.CMac

OpenSSL 似乎没有直接实现 CBC MAC(至少,我找不到对它的任何引用)。所以如果你需要它,你需要自己实现它。

您可以使用具有零 IV 的 CBC 模式加密并获取加密的最后 16 个字节。当然,这意味着您需要将其余密文存储在某个缓冲区中,或者您需要巧妙地使用更新功能(为密文反复使用相同的缓冲区)。

【讨论】:

  • @rmaddy 如果您在答案中遗漏了任何内容,请随时发表评论。同时,我会尝试挖掘一些 Java 代码。
  • @owlstead java 实现不取决于我。改不了
  • 是的,我很害怕,看了你之前的问题,所以我已经在答案的末尾添加了更多信息。
  • 你能尝试自己实现这个,如果你失败了在这里评论吗?我讨厌使用 C/C++ 进行编程,因为我总是遇到编译器/链接器错误之类的问题,这让我想到了编写实际解决方案。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 2013-10-29
  • 2012-04-30
  • 1970-01-01
  • 2011-09-22
  • 2013-02-02
  • 2010-10-31
相关资源
最近更新 更多