中国密码算法与NIST标准对比

1. 引言

NIST定义AES为标准的对称密钥加密算法。但NIST被指出可能在加密算法中添加NSA后门。为此,在中国,ShāngMì (SM) 系列密码算法,作为TLS 1.3集成和无线认证的备选方案:

  • SM2:定义了认证(签名)
  • SM3:定义了哈希函数
  • SM4:定义了加密。由Lü Shuwang于2007年发明,并于2016年称为国标(GB/T 32907-2016)。同时定义在RFC 89998中:
    中国密码算法与NIST标准对比_第1张图片

2. SM2

SM2是与ECDSA、EdDSA、RSA等价的签名方案:
中国密码算法与NIST标准对比_第2张图片
最快的签名方案是ECDSA(P256),其签名速度比CurveSM2快10倍多。但SM2的签名速度也还可以,要比RSA签名速度快10倍。而验签速度,ECDSA的验签速度要比SM2快2倍。【下图源自https://asecuritysite.com/openssl/openssl3_b2】

3. SM3

SM3提供了256位哈希:
中国密码算法与NIST标准对比_第3张图片
SM3是主流哈希中最慢的哈希算法之一,其速度约为SHA-1的37%:【下图源自https://asecuritysite.com/openssl/openssl_full2b】
中国密码算法与NIST标准对比_第4张图片
以“Hello”哈希为例:

echo -n "Hello" | openssl dgst -sm3
dc74f051ad5bc19ba721bf0023e10de03bae29bbe013c43988bae55828bceb

4. SM4

SM4加密算法,其block size为128为,加密密钥为128位:
中国密码算法与NIST标准对比_第5张图片
每个block数据有32轮处理。此外,可在IV(Initialisation Vector)中添加128位的salt值。
总体来首,SM4的性能不如AES和Cha-Cha20。AES-128-ECD的速度约是SM4-ECB的100倍:【下图源自https://asecuritysite.com/openssl/openssl3_b】

SM4示例代码为:

import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
import sys
message="Hello"
keysize=16
iv = os.urandom(16)
mode=0
if (len(sys.argv)>1):
 message=str(sys.argv[1])
if (len(sys.argv)>2):
 mode=int(sys.argv[2])
key = os.urandom(keysize)
padder = padding.PKCS7(128).padder()
unpadder = padding.PKCS7(128).unpadder()
cipher=None
if (mode==0): 
 cipher = Cipher(algorithms.SM4(key), modes.CBC(iv))
if (mode==1): 
 cipher = Cipher(algorithms.SM4(key), modes.OFB(iv))
if (mode==2): 
 cipher = Cipher(algorithms.SM4(key), modes.CFB(iv))
if (mode==3): 
 cipher = Cipher(algorithms.SM4(key), modes.CTR(iv))
if (mode==4): 
 cipher = Cipher(algorithms.SM4(key), modes.ECB())
encryptor = cipher.encryptor()

str=padder.update(message.encode())+padder.finalize()
ciphertext = encryptor.update(str ) + encryptor.finalize()
# Now decrypt
decryptor = cipher.decryptor()

rtn=unpadder.update(decryptor.update(ciphertext) + decryptor.finalize())+unpadder.finalize() 
 
print("Type:\t\t\t",cipher.algorithm.name)
print("Mode:\t\t\t",cipher.mode.name)
print("Message:\t\t",message)
print("Message with padding:\t",str)
print("\nKey:\t\t\t",key.hex())
if (mode!=4): print("IV:\t\t\t",iv.hex())
print("\nCipher:\t\t\t",ciphertext.hex())
print("Decrypt:\t\t",rtn.decode())

运行示例为:

Type:    SM4
Mode:    CBC
Message:   Hello
Message with padding:  b'Hello\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'
Key:    ff010929f29f618ea5181a6a2e9de7a0
IV:    56f8a40da11cd93a67172311470879c3
Cipher:    292994cf3bf587e2b9f020a6c94026c1
Decrypt:   Hello

SM4也是OpenSSL 3.X的核心组件:
中国密码算法与NIST标准对比_第6张图片

5. 结论

  • SM2签名算法,签名速度要比ECDSA(P256)慢10倍。
  • SM3哈希算法,哈希运算用时是SHA-1的3倍。
  • SM4对称加密算法,比AES要慢很多。原因可能在于对AES有很多处理器加速。

参考资料

[1] How Do The Chinese Ciphers Compare with NIST Standards?

你可能感兴趣的:(基础理论,基础理论)