Skip to content

Latest commit

 

History

History
64 lines (41 loc) · 1.9 KB

secret-key_authentication.md

File metadata and controls

64 lines (41 loc) · 1.9 KB

对称密码学 认证算法

例子

#define MESSAGE (const unsigned char *) "test"
#define MESSAGE_LEN 4

unsigned char key[crypto_auth_KEYBYTES];
unsigned char mac[crypto_auth_BYTES];

randombytes_buf(key, sizeof key);
crypto_auth(mac, MESSAGE, MESSAGE_LEN, key);

if (crypto_auth_verify(mac, MESSAGE, MESSAGE_LEN, key) != 0) {
    /* message forged! */
}

目的

这个操作使用一个 key 计算一个消息的 认证tag,并提供一种方式来验证一个 tag 对 给定消息和 key 是否合法。

这个函数确定地计算 认证tag: 相同的 (消息, key) 二元组,总是产生出相同的输出 tag。 然后,就算消息是公开的,也要求知道 key 才能计算出合法的 tag。 因此,key 应该保持保密。 tag 是可以公开的。

一个典型的使用案例是:

  • A 准备一个消息,加上一个认证tag,发送给 B
  • A 不存储这条消息。
  • 过一会,B 发送这条消息和认证 tag 给 A
  • A 使用认证 tag 来验证 确实是自己创建了这条消息。

这种操作 并不加密 这条消息,只是生成和验证 认证tag。

使用

int crypto_auth(unsigned char *out, const unsigned char *in,
                unsigned long long inlen, const unsigned char *k);

crypto_auth() 函数用 key k,为 长度是 inlen 的消息 in 计算出 tag, k 必须是 crypto_auth_KEYBYTES 字节长. 本函数把 tag 放入  out,tag 是 crypto_auth_BYTES 字节长.

int crypto_auth_verify(const unsigned char *h, const unsigned char *in,
                       unsigned long long inlen, const unsigned char *k);

crypto_auth_verify() 函数 用 key k 来验证 tag h 是 长度 inlen 的 消息 in 的合法 tag 。 返回 -1 表示验证失败,0表示验证成功通过。

常量

  • crypto_auth_BYTES
  • crypto_auth_KEYBYTES

算法细节

  • HMAC-SHA512256