- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个项目,需要对大量数据进行身份验证。 GMAC 似乎是为高吞吐量操作而设计的。我只需要消息验证码,不需要加密。OpenSSL 是否有 GMAC API 或仅计算 GMAC 代码的示例?
我知道 GCM 用于加密和身份验证,但就我而言,不需要加密。有没有使用 openssl 仅进行 GMAC 计算的示例?
最佳答案
Does OpenSSL have GMAC API and examples...
OpenSSL wiki 在EVP Authenticated Encryption and Decryption 有一个经过身份验证的加密模式示例。 .
GMAC 是 GCM 模式的一个特例。来自 NIST 的 Special Publication 800-38D :
If the GCM input is restricted to data that is not to be encrypted, the resulting specialization of GCM, called GMAC, is simply an authentication mode on the input data...
因此,您需要做的就是将数据发送到附加验证数据 (AAD) channel ,而不是纯文本 (PT) channel 。
以下示例使用 NIST 的 GCM Test Vectors 中的测试向量。请注意,PT 数据为空,仅提供了 AAD 数据:
[Keylen = 128]
[IVlen = 96]
[PTlen = 0]
[AADlen = 128]
[Taglen = 128]
Count = 0
Key = 77be63708971c4e240d1cb79e8d77feb
IV = e0e00f19fed7ba0136a797f3
PT =
AAD = 7a43ec1d9c0a5a78a0b16533a6213cab
CT =
Tag = 209fcc8d3675ed938e9c7166709dd946
这是使用硬编码数据的程序(在 Pastebin 上 OpenSSL GMAC example ):
int rc = 0, unused;
unsigned int i;
byte key[] = { 0x77, 0xbe, 0x63, 0x70, 0x89, 0x71, 0xc4, 0xe2,
0x40, 0xd1, 0xcb, 0x79, 0xe8, 0xd7, 0x7f, 0xeb };
byte iv[] = { 0xe0, 0xe0, 0x0f, 0x19, 0xfe, 0xd7, 0xba, 0x01,
0x36, 0xa7, 0x97, 0xf3 };
byte aad[] = { 0x7a, 0x43, 0xec, 0x1d, 0x9c, 0x0a, 0x5a, 0x78,
0xa0, 0xb1, 0x65, 0x33, 0xa6, 0x21, 0x3c, 0xab };
byte tag[16] = { /* calculated */ };
byte exp[] = { 0x20, 0x9f, 0xcc, 0x8d, 0x36, 0x75, 0xed, 0x93,
0x8e, 0x9c, 0x71, 0x66, 0x70, 0x9d, 0xd9, 0x46 };
EVP_CIPHER_CTX *ctx = NULL;
ctx = EVP_CIPHER_CTX_new();
ASSERT(ctx != NULL);
rc = EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL);
ASSERT(rc == 1);
rc = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, sizeof(iv), NULL);
ASSERT(rc == 1);
rc = EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv);
ASSERT(rc == 1);
rc = EVP_EncryptUpdate(ctx, NULL, &unused, aad, sizeof(aad));
ASSERT(rc == 1);
rc = EVP_EncryptFinal_ex(ctx, NULL, &unused);
ASSERT(rc == 1);
rc = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, sizeof(tag), tag);
ASSERT(rc == 1);
printf("Calculated tag:\n ");
for(i = 0; i < sizeof(tag); i++)
{
printf("%02x", tag[i]);
if(i == sizeof(tag) - 1) {
printf("\n");
}
}
printf("Expected tag:\n ");
for(i = 0; i < sizeof(exp); i++)
{
printf("%02x", exp[i]);
if(i == sizeof(exp) - 1) {
printf("\n");
}
}
if(ctx) {
EVP_CIPHER_CTX_free(ctx);
}
最后,这是程序的输出:
$ ./t.exe
Calculated tag:
209fcc8d3675ed938e9c7166709dd946
Expected tag:
209fcc8d3675ed938e9c7166709dd946
关于authentication - OpenSSL 是否有 GMAC API 和示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003702/
我正在开发一个项目,需要对大量数据进行身份验证。 GMAC 似乎是为高吞吐量操作而设计的。我只需要消息验证码,不需要加密。OpenSSL 是否有 GMAC API 或仅计算 GMAC 代码的示例? 我
我正在尝试将 AES-GMAC 与 BCrypt(如果有帮助,则为 Microsoft CNG)一起使用,但文档似乎与我的预期相矛盾。 RFC 4543声明 AES-GMAC 需要一个 key (这是
无法确定 linux 内核 4.4 是否支持使用 AES GMAC 的 IPSEC AH 传输。 尝试“ip xfrm state”命令的各种组合,但没有成功。这实现了吗? Try 1 sudo ip
我是一名优秀的程序员,十分优秀!