我需要在阅读器和 NFC 标签之间实施身份验证程序,但由于我在这方面的知识有限,我将感谢一些帮助以理解一些概念。
提前原谅我改写圣经,但我无法对其进行更多总结。
有很多标签系列(ICODE、MIFARE、NTAG...),但经过研究,我认为 NTAG 424 DNA 符合我的要求(我主要需要身份验证功能)。
它带有 AES 加密、CMAC 协议和 3 遍身份验证系统,这就是我开始需要帮助的时候。
AES -> 正如我所关心的,这是一种通过排列和映射来加密纯文本的分组密码。是一种对称标准,它不使用主密钥,而是使用会话密钥,它们是从主密钥派生的。(Q01:我不知道这些密钥在标签中的存储位置。密钥必须存储在专门的硬件上,但除了 MIFARE SAM 标签外,没有标签“规格”对此进行说明。)
CMAC -> 它是 CBC-MAC 的一种改变,使动态大小消息的身份验证安全。如果数据不是机密的,那么 MAC 可以用于明文来验证它们,但是为了获得机密性和身份验证功能,必须追求“加密比 mac”。这里也使用了会话密钥,但与加密步骤中使用的密钥不同。(Q02:CMAC的整体观点可能是一个实现验证和保密的协议,这是我的观点,可能是错误的。)
3-pass-protocol -> ISO/IEC 9798-2 规范,其中标签和阅读器相互验证。它还可以使用 MAC 和会话密钥来完成此任务。(Q03:我认为这是所有系统的上层来验证标签和阅读器。“3 pass 协议”在 MAC 中中继才能起作用,如果还需要机密性功能,那么可能会使用 CMAC 而不是单个 MAC .CMAC 需要 AES 才能正常工作,在每个步骤中应用会话密钥。如果我发布了 savages 错误,请纠正我)
/*********/
PS:我知道这是一个与编码相关的论坛,但我肯定可以在这里找到比我更了解密码学的人来回答这个问题。
PSS:我完全不知道标签端的主密钥和会话密钥保存在哪里。它们是否需要与主 NFC 电路一起包含在单独的硬件中?
(目标)
这是为了实现标签和阅读器之间的相互验证过程,使用 NTAG 424 DNA TagTamper 标签。(目标是避免 3º 方复制,以身份验证而不是消息机密性为主要部分)
缺乏密码学知识并试图了解如何在此 NTAG 上使用 AES、CMAC 和相互验证。
(额外信息)
NTAG 424 DNA TT: https ://www.nxp.com/products/identification-security/rfid/nfc-hf/ntag/ntag-for-tags-labels/ntag-424-dna-424-dna-tagtamper-advanced - …
我正在尝试生成使用OpenSSL计算CMAC的密钥.
但是,这些似乎失败了,下面复制了错误消息.有人能指出问题所在吗?有人EVP_DigestSign*
打电话给CMAC 吗?
以下是代码的一部分,该代码是通过https://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation中的示例构建的:
BIO *out = NULL;
out = BIO_new(BIO_s_file());
if (out == NULL)
return -1;
BIO_set_fp(out, stdout, BIO_NOCLOSE);
EVP_MD_CTX* rctx = NULL;
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *kctx = NULL;
rctx = EVP_MD_CTX_create();
if(rctx == NULL) {
printf("EVP_MD_CTX_create failed\n");
}
if(!EVP_PKEY_keygen_init(kctx)){
printf("EVP_PKEY_keygen_init failed\n");
}
if (EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,EVP_PKEY_CTRL_CIPHER,0, (void *)EVP_aes_256_ecb()) <= 0)
printf("EVP_PKEY_CTX_ctrl 1 failed\n");
if (EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,EVP_PKEY_CTRL_SET_MAC_KEY,/*key length*/32, "01234567890123456789012345678901") <= 0)
printf("Set the key data failed 1\n");
Run Code Online (Sandbox Code Playgroud)
这里的错误:
EVP_PKEY_CTX_ctrl failed
3073898120:error:06093096:lib(6):func(147):reason(150):pmeth_gn.c:122:
3073898120:error:06089093:lib(6):func(137):reason(147):pmeth_lib.c:390: …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个可以将 AES128 CMAC 作为命令行计算的工具。Openssl 似乎没有通过命令行提供此功能。我是否错过了什么,或者您知道可以执行此计算的命令行工具吗?
我正在尝试使用 BouncyCastle 的 CMac 实现,但显然我做错了。至少以下单元测试(基于 RFC 5297 测试向量)失败:
@Test
public void testCMacOfZeros() {
byte[] key = {(byte) 0xff, (byte) 0xfe, (byte) 0xfd, (byte) 0xfc, //
(byte) 0xfb, (byte) 0xfa, (byte) 0xf9, (byte) 0xf8, //
(byte) 0xf7, (byte) 0xf6, (byte) 0xf5, (byte) 0xf4, //
(byte) 0xf3, (byte) 0xf2, (byte) 0xf1, (byte) 0xf0, //
(byte) 0xf0, (byte) 0xf1, (byte) 0xf2, (byte) 0xf3, //
(byte) 0xf4, (byte) 0xf5, (byte) 0xf6, (byte) 0xf7, //
(byte) 0xf8, (byte) 0xf9, (byte) 0xfa, (byte) 0xfb, //
(byte) …
Run Code Online (Sandbox Code Playgroud) http://en.wikipedia.org/wiki/CMAC
http://www.rfc-archive.org/getrfc.php?rfc=4493
有两个键K1和K2。除了消息 1 与 10^127(1 和 127 个零)不同之外,还有其他原因吗
如果消息携带长度(并且长度也是 CMAC-ed 的消息),仅使用一个随机生成的 K 是否存在任何安全弱点?
我正在尝试使用斯坦福 Javascript 加密库为 OAuth 2.0 断言生成 CMAC-AES 令牌,但我远不是密码学专家。有人可以举一个使用 sjcl 或任何开放许可的 js 库的例子吗?我什至不确定是否可以使用 sjcl 的现有功能。
我尝试使用我在这个问题中看到的选项对象,但我不了解模式或其他选项,我找不到任何关于此的文档。我认为 salt 和 iv(要成为可复制的 MAC)必须是静态的,但我不知道它们应该是什么值。
// is there a way that works?
var token = sjcl.encrypt(secret,assertion,{salt:foo,iv:bar});
Run Code Online (Sandbox Code Playgroud)
一点背景……这是将原生移动应用程序(iOS 和 android)重写为单个混合应用程序(Cordova、HTML、CSS 和 JavaScript),我希望尽可能多地在 JavaScript 中共享代码. 这不会在“不安全”的浏览器环境中运行,而是在本机 WebViews 中运行。如果您知道其他安全问题,我想听听。
否则我想我将不得不编写一个插件来从本机实现传递 CMAC。
忘了提,我也在使用 Dojo,我知道 dojox.encoding.crypto 但问题对我来说是一样的。不确定它是否可以执行 CMAC 或需要多少修改才能使其工作。
有没有办法用OpenSSL
/ 计算AES CMAC libcrypto
?
优选地,以利用AES-NI(或任何其他硬件加速)的方式.
cmac ×8
aes ×4
cryptography ×3
openssl ×3
encryption ×2
message-authentication-code ×2
bouncycastle ×1
c# ×1
dojo ×1
java ×1
javascript ×1
libcrypto ×1
linux ×1
nfc ×1
oauth ×1