1. 引言
NIST定义AES为标准的对称密钥加密算法。但NIST被指出可能在加密算法中添加NSA后门。为此,在中国,ShāngMì (SM) 系列密码算法,作为TLS 1.3集成和无线认证的备选方案:
- SM2:定义了认证(签名)
- SM3:定义了哈希函数
- SM4:定义了加密。由Lü Shuwang于2007年发明,并于2016年称为国标(GB/T 32907-2016)。同时定义在RFC 89998中:
2. SM2
SM2是与ECDSA、EdDSA、RSA等价的签名方案:
最快的签名方案是ECDSA(P256),其签名速度比CurveSM2快10倍多。但SM2的签名速度也还可以,要比RSA签名速度快10倍。而验签速度,ECDSA的验签速度要比SM2快2倍。【下图源自https://asecuritysite.com/openssl/openssl3_b2】
3. SM3
SM3提供了256位哈希:
SM3是主流哈希中最慢的哈希算法之一,其速度约为SHA-1的37%:【下图源自https://asecuritysite.com/openssl/openssl_full2b】
以“Hello”哈希为例:
echo -n "Hello" | openssl dgst -sm3
dc74f051ad5bc19ba721bf0023e10de03bae29bbe013c43988bae55828bceb
4. SM4
SM4加密算法,其block size为128为,加密密钥为128位:
每个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
5. 结论
- SM2签名算法,签名速度要比ECDSA(P256)慢10倍。
- SM3哈希算法,哈希运算用时是SHA-1的3倍。
- SM4对称加密算法,比AES要慢很多。原因可能在于对AES有很多处理器加速。