AES-NI 加密模式 |
ECB | 将明文分成块,每个块独立加密。相同的明文块会得到相同的密文块,可能导致安全性问题 加密: 1: 加载128位密钥到XMM 寄存器 2: 将待加密的明文数据加载到XMM 寄存器 3: 使用AESENC 指令执行加密操作,将密钥和明文数据作为输入,得到密文数据 4: 存储加密后的数据或继续处理其他数据块 于解密 1:加载128位密钥到XMM寄存器。 2:将待解密的密文数据加载到XMM寄存器。 3:使用AESDEC指令执行解密操作,将密钥和密文数据作为输入,得到明文数据。 4:存储解密后的数据或继续处理其他数据块 每个数据块都是独立加密的,因此对于大于128位的数据,需要按照数据块大小分割数据并分别进行加密和解密 section .data
key db 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
plaintext db "This is a secret message", 0
ciphertext rb 16
section .text
global _start
; 加密函数
aes_ecb_encrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm0, [plaintext] ; Load plaintext
AESENC xmm0, xmm1 ; Encrypt using AES-NI instruction
movdqu [ciphertext], xmm0 ; Store ciphertext
ret
; 解密函数
aes_ecb_decrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm0, [ciphertext] ; Load ciphertext
AESDEC xmm0, xmm1 ; Decrypt using AES-NI instruction
movdqu [plaintext], xmm0 ; Store plaintext
ret
_start:
; 调用加密函数
call aes_ecb_encrypt
; 调用解密函数
call aes_ecb_decrypt
; 退出程序
mov eax, 60 ; syscall number for exit
xor edi, edi ; exit code 0
syscall |
CBC | 使用前一个密文块作为下一个明文块的输入,增加了安全性 每个明文块会先与前一个密文块进行异或运算,然后再进行加密。解密时需要先解密密文块,然后与前一个密文块进行异或运算得到明文块 加密: 1:将初始向量(IV)与第一个明文块进行异或运算。 2:对结果进行加密得到第一个密文块。 3:将第一个密文块与第二个明文块进行异或运算。 4:对结果进行加密得到第二个密文块。 5:依此类推,直到所有明文块都被处理。 解密: 1:解密第一个密文块得到第一个明文块。 2:将解密得到的第一个明文块与初始向量(IV)进行异或运算得到第一个明文块的原始内容。 3:解密第二个密文块得到第二个明文块。 4:将解密得到的第二个明文块与第一个密文块进行异或运算得到第二个明文块的原始内容。 5:依此类推,直到所有密文块都被处理 section .data
key db 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
iv db 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
plaintext db "This is a secret message", 0
ciphertext rb 16
section .text
global _start
; 加密函数
aes_cbc_encrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [plaintext] ; Load plaintext
AESENC xmm0, xmm2 ; XOR with IV
AESENC xmm0, xmm1 ; Encrypt using AES-NI instruction
movdqu [ciphertext], xmm0 ; Store ciphertext
ret
; 解密函数
aes_cbc_decrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [ciphertext] ; Load ciphertext
AESENCLAST xmm0, xmm1 ; Decrypt using AES-NI instruction
AESENCLAST xmm0, xmm2 ; XOR with IV
movdqu [plaintext], xmm0 ; Store plaintext
ret
_start:
; 调用加密函数
call aes_cbc_encrypt
; 调用解密函数
call aes_cbc_decrypt
; 退出程序
mov eax, 60 ; syscall number for exit
xor edi, edi ; exit code 0
syscall |
CTR | 使用初始化向量和计数器生成密钥流,然后与明文进行异或操作来实现加密。 CTR模式将初始向量(IV)视为计数器,对每个明文块使用不同的计数器值进行加密,然后将加密结果与明文块进行异或运算得到密文块 有并行加密和解密的优势,并且不需要填充数据。但需要确保每个计数器值只用于加密一个明文块,以避免安全性问题。 加密: 1: 选择一个随机的初始向量(IV)作为计数器的起始值。 2:对每个明文块使用不同的计数器值进行加密,通常是通过对IV进行递增操作得到新的计数器值。 3:将加密结果与对应的明文块进行异或运算得到密文块。 4:依此类推,直到所有明文块都被处理。 解密: 1:选择与加密时相同的初始向量(IV)作为计数器的起始值。 2:对每个密文块使用不同的计数器值进行加密,通常是通过对IV进行递增操作得到新的计数器值。 3:将解密结果与对应的密文块进行异或运算得到明文块。 4:依此类推,直到所有密文块都被处理。 section .data
key db 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
iv db 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
plaintext db "This is a secret message", 0
ciphertext rb 16
section .text
global _start
; 加密函数
aes_ctr_encrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [plaintext] ; Load plaintext
AESENC xmm2, xmm1 ; Encrypt IV using AES-NI instruction
AESENC xmm0, xmm2 ; Encrypt plaintext using AES-NI instruction
movdqu [ciphertext], xmm0 ; Store ciphertext
ret
; 解密函数
aes_ctr_decrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [ciphertext] ; Load ciphertext
AESENC xmm2, xmm1 ; Encrypt IV using AES-NI instruction
AESENC xmm0, xmm2 ; Decrypt ciphertext using AES-NI instruction
movdqu [plaintext], xmm0 ; Store plaintext
ret
_start:
; 调用加密函数
call aes_ctr_encrypt
; 调用解密函数
call aes_ctr_decrypt
; 退出程序
mov eax, 60 ; syscall number for exit
xor edi, edi ; exit code 0
syscall |
CFB | 将前一个密文块的输出与密钥流进行异或操作,然后再与当前明文块进行异或操作 对称加密模式,它允许将块密码转换为流密码。在CFB模式下,前一个密文块会被输入到加密函数中,然后与明文进行异或运算以产生密文。 CFB模式可以实现部分加密和解密,因为每个密文块的生成只依赖于前一个密文块,而不需要整个消息。这使得CFB模式适用于流数据,并且能够隐藏明文中的重复模式 加密: 将初始向量(IV)输入到加密函数中得到第一个密文块。 将第一个密文块与第一个明文块进行异或运算得到加密结果。 将第一个密文块输入到加密函数中得到第二个密文块。 将第二个密文块与第二个明文块进行异或运算得到加密结果。 依此类推,直到所有明文块都被处理。 解密: 将初始向量(IV)输入到加密函数中得到第一个密文块。 将第一个密文块与第一个密文块进行异或运算得到解密结果,即第一个明文块。 将第一个密文块输入到加密函数中得到第二个密文块。 将第二个密文块与第二个密文块进行异或运算得到解密结果,即第二个明文块。 依此类推,直到所有密文块都被处理。 section .data
key db 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
iv db 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
plaintext db "This is a secret message", 0
ciphertext rb 16
section .text
global _start
; 加密函数
aes_cfb_encrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [plaintext] ; Load plaintext
AESENC xmm2, xmm1 ; Encrypt IV using AES-NI instruction
PXOR xmm0, xmm2 ; XOR plaintext with encrypted IV
movdqu [ciphertext], xmm0 ; Store ciphertext
ret
; 解密函数
aes_cfb_decrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [ciphertext] ; Load ciphertext
AESENC xmm2, xmm1 ; Encrypt IV using AES-NI instruction
PXOR xmm0, xmm2 ; XOR ciphertext with encrypted IV to get plaintext
movdqu [plaintext], xmm0 ; Store plaintext
ret
_start:
; 调用加密函数
call aes_cfb_encrypt
; 调用解密函数
call aes_cfb_decrypt
; 退出程序
mov eax, 60 ; syscall number for exit
xor edi, edi ; exit code 0
syscall |
OFB | 类似于CFB,但是使用前一个输出块而不是前一个密文块 一种对称加密模式,它将块密码转换为流密码。在OFB模式下,前一个密文块会被输入到加密函数中生成伪随机数流,然后与明文进行异或运算以产生密文 加密: 将初始向量(IV)输入到加密函数中得到第一个伪随机数流。 将第一个伪随机数流与第一个明文块进行异或运算得到第一个密文块。 将第一个伪随机数流输入到加密函数中得到第二个伪随机数流。 将第二个伪随机数流与第二个明文块进行异或运算得到第二个密文块。 依此类推,直到所有明文块都被处理。 解密: 与加密过程相同,将初始向量(IV)输入到加密函数中得到第一个伪随机数流。 将第一个伪随机数流与第一个密文块进行异或运算得到第一个明文块。 将第一个伪随机数流输入到加密函数中得到第二个伪随机数流。 将第二个伪随机数流与第二个密文块进行异或运算得到第二个明文块。 依此类推,直到所有密文块都被处理。 特点: 加密和解密使用相同的算法,因此操作是可逆的。 可以实现部分加密和解密,因为每个密文块的生成只依赖于前一个伪随机数流,而不需要整个消息。 OFB模式可以并行处理数据,适用于流数据加密。 通过将块密码转换为流密码,提供了一种安全且高效的加密方式,同时保持了加密和解密操作的一致性。 section .data
key db 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
iv db 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
plaintext db "This is a secret message", 0
ciphertext rb 16
section .text
global _start
; 加密函数
aes_ofb_encrypt:
movdqu xmm1, [key] ; Load key
movdqu xmm2, [iv] ; Load IV
movdqu xmm0, [plaintext] ; Load plaintext
AESENC xmm2, xmm1 ; Encrypt IV using AES-NI instruction
movdqu xmm3, xmm2 ; Save the encrypted IV
PXOR xmm0, xmm2 ; XOR plaintext with encrypted IV
movdqu [ciphertext], xmm0 ; Store ciphertext
ret
; 解密函数(OFB模式下解密与加密相同)
aes_ofb_decrypt:
call aes_ofb_encrypt ; OFB decryption is the same as encryption
ret
_start:
; 调用加密函数
call aes_ofb_encrypt
; 调用解密函数
call aes_ofb_decrypt
; 退出程序
mov eax, 60 ; syscall number for exit
xor edi, edi ; exit code 0
syscall |