訊息認證碼 CMAC

2021-10-05 08:42:37 字數 1932 閱讀 2666

**於nist的標準

「recommendation for block cipher modes of operation: the cmac mode for authentication」   --nist

基於分組密碼cbc模式的 訊息認證碼,最後乙個分組(可能需要填充填充10...0)與子金鑰異或後參與cbc模式加密。

子金鑰生成:

訊息認證碼生成:

工作流程圖:

openssl 實現:

#include

#include

#include

#include "internal/cryptlib.h"

#include

struct cmac_ctx_st ;

/* make temporary keys k1 and k2 */

static void make_kn(unsigned char *k1, const unsigned char *l, int bl)

cmac_ctx *cmac_ctx_new(void)

ctx->nlast_block = -1;

return ctx;

}void cmac_ctx_cleanup(cmac_ctx *ctx)

evp_cipher_ctx *cmac_ctx_get0_cipher_ctx(cmac_ctx *ctx)

void cmac_ctx_free(cmac_ctx *ctx)

int cmac_ctx_copy(cmac_ctx *out, const cmac_ctx *in)

int cmac_init(cmac_ctx *ctx, const void *key, size_t keylen,

const evp_cipher *cipher, engine *impl)

;/* all zeros means restart */

if (!key && !cipher && !impl && keylen == 0)

/* initialise context */

if (cipher && !evp_encryptinit_ex(ctx->cctx, cipher, impl, null, null))

return 0;

/* non-null key means initialisation complete */

if (key)

return 1;

}int cmac_update(cmac_ctx *ctx, const void *in, size_t dlen)

/* encrypt all but one of the complete blocks left */

while (dlen > bl)

/* copy any data left to last block buffer */

memcpy(ctx->last_block, data, dlen);

ctx->nlast_block = dlen;

return 1;

int cmac_final(cmac_ctx *ctx, unsigned char *out, size_t *poutlen)

else

if (!evp_cipher(ctx->cctx, out, out, bl))

return 1;

}int cmac_resume(cmac_ctx *ctx)

訊息認證碼 hmac

hmac hash message authentication code 是用來確認訊息的完整性及認證訊息的傳送者的技術 完整性,是通過判斷hash值來確定的 認證,是通過對稱密碼的金鑰來完成的 因為是對稱密碼,所以傳送發和接收方事先需要共享金鑰 公式 hmac hash msg,key 傳送方傳...

訊息認證碼(MAC)

訊息認證碼 帶密碼的hash 能提取訊息的 指紋 訊息認證碼 mac message authentication code 是種訊息認證技術。傳送方a和接收方b共享金鑰 k,若a向b傳送訊息。則a計算利用c f k,m 計算mac值 然後將原始訊息m和c一起傳送給接收方。接收方b對收到的訊息m用相...

資料完整性演算法 訊息認證碼 2

訊息認證函式 任何訊息認證或數字簽名都有上下兩層,下層有產生認證符的函式,認證符是乙個用來認證訊息的值,上層協議將該函式作為原語使接收方可以驗證訊息的真實性。產生認證符的函式有哪些?訊息加密 訊息加密提供了一種認證手段,對稱密碼和公鑰密碼體制中對訊息加密的方法是不同的,下面的我們先談談公鑰加密 直接...