CCM加密认证模式

(本文资料主要来自:RFC3610)

CCM是Cipher Block Chaining Message Authentication Code (CBC-MAC)和Counter模式(CTR)的组合。可以同时生存认证信息和对数据加密。CCM广泛用于互联网和物联网中对传输数据进行保护。而且很多MCU中都实现了对CCM的硬件支持,使用也比较方便。下面的介绍主要根据RFC3610整理。

在数据通信中,传输中的数据包由两部分构成:数据包头和用户数据(payload)。用户数据一般需要加密以防止窃听。但传输路上的设备(路由器、交换机等)往往需要参照数据包头以保证把数据包能正确地送到目的地,因此数据包头不能加密。网络通信中的风险除了窃听,还有恶意篡改、伪造等其他行为。因此为了保证收到的数据包没有被篡改,需要对整个数据、包括包头进行认证。


数据认证

认证采用CBC-MAC模式。需要指定两个参数:

  • 认证域的长度M:可以是4、6、8、10、12、14、16。
  • 长度域的长度(大小)L。

M、L均用3bit编码,编码方式如下:
M域:(M-2)/2;
L域:L-1。

为了认证处理,需要的信息如下:

  • 密钥K
  • Nonce N,长度为:15-L。Nonce在一个密钥的使用周期内必须确保唯一。
  • 明文信息m,其长度l(m)的范围为0≤l(m)<2^(8L),目的是其长度确保可以由L字节的长度域保存。
  • 额外认证数据a(一般为数据包的报头),其长度为l(a),大小范围为:0≤l(a)<2^(64)。这部分数据只认证(Authenticate),不加密。因此也不包含在该模式的输出中。主要是用于认证明文的报头、或影响消息解析的上下文信息。

CBC-MAC的操作流程如下:

这里写图片描述

为了利用上述算法,需要构建各个块mi,也叫B_i。每块的大小是16bytes。

B_0由Nonce和一下特殊规则构成:

Octet NumberContents
0Flags
1 … 15-LNonce N
16-L … 15l(m)

第一个字节的Flags域由以下bit构成:

Bit NumberContents
7Reserved (always zero)
6Adata,=0 IF l(a) = 0;=1 IF l(a)>0
5…3根据认证域长度编码(M-2)/2
2…0根据长度域长度编码(L-1),(L=1为保留值,禁止使用)

如果l(a)>0,在B_0之后,会添加一个或多个认证数据块(Authentication Data Block)。认证数据块由以下方式构建:将l(a)按以下方式编码,并添加到额外认证数据a之前,然后分割为16字节的数据块。如果不足,则在最后一个数据块中补0。
l(a)的编码方式如下,并且most-significant-byte first order。

First two octetsFollowed byComment
0x0000NothingReserved
0x0001 … 0xFEFFNothingFor 0 < l(a) < (2^16 - 2^8)
0xFF00 … 0xFFFDNothingReserved
0xFFFE4 octets of l(a)For (2^16 - 2^8) <= l(a) < 2^32
0xFFFF8 octets of l(a)For 2^32 <= l(a) < 2^64

在上述块之后,增进消息块:分割消息m为16字节的块,并在最后一块根据需要补0为一个完整的16字节块。

对上述生存的数据块B_i,基本的计算公式如下:
X_1 := E( K, B_0 )
X_i+1 := E( K, X_i XOR B_i ) for i=1, …, n
T := first-M-bytes( X_n+1 )

其中:
E()—block cipher encryption function
T—MAC value.


数据加密

采用Counter(CTR)模式,其操作流程如下:

这里写图片描述

需要进行加密计算的Counter域A_i根据以下方式生成:

Octet NumberContents
0Flags
1 … 15-LNonce N
16-L … 15Counter i

其中的Counter i域以most-significant-byte first order形式编码。第一个字节的Flags域由以下bit构成:

Bit NumberContents
7Reserved (always zero)
6Reserved (always zero)
5…3Zero
2…0L’=L-1,(L:长度域长度,L=1为保留值,禁止使用)

加密计算后的结果表示为S_i:\

S_i := E( K, A_i ) for i=0, 1, 2, …

将上述加密后的结果S_1, S_2, S_3 … .组合成数据串,并取前l(m)个字节与明文数据m进行XOR操作,得到密文。注意:S_0不用于XOR操作。

最终的认证串的值U则利用S_0计算得到,如下所示:

U := T XOR first-M-bytes( S_0 )

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: AES-CCM算法是一种对称加密算法,用于对数据进行机密性和完整性的保护。它结合了AES加密CCM模式,并提供了一种高效的方式来进行安全通信。 下面是AES-CCM算法的代码实现: ``` import hashlib from Crypto.Cipher import AES from Crypto.Util import Counter # 定义函数,用于实现AES-CCM算法加密 def aes_ccm_encrypt(key, nonce, plaintext, associated_data): # 设置加密模式为CTR ctr = Counter.new(128, initial_value=int.from_bytes(nonce, byteorder='big')) aes = AES.new(key, AES.MODE_CTR, counter=ctr) # 计算指定数据的MAC值 mac_key = hashlib.sha256(bytes.fromhex(key)).digest() aes_mac = AES.new(mac_key, AES.MODE_ECB) mac = aes_mac.encrypt(associated_data) # 对明文进行加密 ciphertext = aes.encrypt(plaintext) # 将MAC值与密文进行合并 encrypted_data = mac + ciphertext return encrypted_data # 定义函数,用于实现AES-CCM算法解密 def aes_ccm_decrypt(key, nonce, encrypted_data, associated_data): # 设置加密模式为CTR ctr = Counter.new(128, initial_value=int.from_bytes(nonce, byteorder='big')) aes = AES.new(key, AES.MODE_CTR, counter=ctr) # 计算指定数据的MAC值 mac_key = hashlib.sha256(bytes.fromhex(key)).digest() aes_mac = AES.new(mac_key, AES.MODE_ECB) mac = aes_mac.encrypt(associated_data) # 将MAC值与密文分离 received_mac = encrypted_data[:16] ciphertext = encrypted_data[16:] # 验证MAC值是否一致 if mac != received_mac: raise ValueError("MAC verification failed") # 对密文进行解密 plaintext = aes.decrypt(ciphertext) return plaintext # 测试示例 key = '2b7e151628aed2a6abf7158809cf4f3c' nonce = '000000300000000000000000' plaintext = 'Hello, World!' associated_data = 'Test' encrypted_data = aes_ccm_encrypt(bytes.fromhex(key), bytes.fromhex(nonce), plaintext.encode(), associated_data.encode()) decrypted_data = aes_ccm_decrypt(bytes.fromhex(key), bytes.fromhex(nonce), encrypted_data, associated_data.encode()) print("加密后的数据:", encrypted_data.hex()) print("解密后的数据:", decrypted_data.decode()) ``` 以上代码实现了AES-CCM算法加密和解密过程。可以通过指定密钥、随机数、明文和关联数据进行加密,然后再通过指定密钥、随机数、加密后的数据和关联数据进行解密。最后打印出加密后的数据和解密后的数据。 ### 回答2: AES-CCM算法是一种以AES加密CCM(Counter with CBC-MAC)模式结合的加密算法。这个算法主要用于提供对称加密以及完整性和认证的安全保证。 AES-CCM算法的实现可以使用一些编程语言来进行。以下是一个Python语言的代码示例: ``` from Crypto.Cipher import AES from Crypto.Util import Counter def aes_ccm_encrypt(key, nonce, plaintext, mac_len, auth_data): counter = Counter.new(64, prefix=nonce) cipher = AES.new(key, AES.MODE_CTR, counter=counter) ciphertext = cipher.encrypt(plaintext) ccm_cipher = AES.new(key, AES.MODE_CBC, nonce) mac = ccm_cipher.encrypt(ciphertext[-auth_data:]) return nonce + ciphertext + mac def aes_ccm_decrypt(key, ciphertext, mac_len, auth_data): nonce = ciphertext[:16] ciphertext = ciphertext[16:-mac_len] mac = ciphertext[-mac_len:] ccm_cipher = AES.new(key, AES.MODE_CBC, nonce) expected_mac = ccm_cipher.encrypt(ciphertext[-auth_data:]) if mac != expected_mac: raise ValueError("Message authentication failed!") counter = Counter.new(64, prefix=nonce) cipher = AES.new(key, AES.MODE_CTR, counter=counter) plaintext = cipher.decrypt(ciphertext) return plaintext # 以下为使用示例 key = b'Sixteen byte key' nonce = b'Initialization V' plaintext = b'Plain text' mac_len = 8 auth_data = b'Additional data' ciphertext = aes_ccm_encrypt(key, nonce, plaintext, mac_len, auth_data) decrypted_plaintext = aes_ccm_decrypt(key, ciphertext, mac_len, auth_data) print("Ciphertext:", ciphertext) print("Decrypted plaintext:", decrypted_plaintext) ``` 以上代码演示了如何使用AES-CCM算法进行加密和解密操作。其中,`key`是16字节长度的加密密钥,`nonce`是12字节长度的随机值,`plaintext`是待加密的明文数据,`mac_len`是MAC(Message Authentication Code)的长度,`auth_data`是附加数据。加密函数`aes_ccm_encrypt`将明文加密成密文,解密函数`aes_ccm_decrypt`将密文解密成明文。最后的输出显示了密文和解密后的明文。 注意,代码中使用了`Crypto`库来实现AES加密CCM模式操作,需要提前安装这个库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值