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