Destroyed 从OpenSSL迁移至GmSSL (markdown)

Zhi Guan
2017-02-13 18:02:50 +08:00
parent 323841609f
commit aa4d778413

@@ -1,21 +0,0 @@
在有源代码的情况下可以很容易将基于OpenSSL密码库的应用程序迁移至GmSSL上并将其中的国际密码算法替换为国密算法。我们以比特币(Bitcoin)的官方客户端(v-0.9)为例介绍迁移的基本流程。比特币的官方客户端是由C++编写的应用程序采用的密码算法固定设置为RIPEMD160、SHA-256、SHA-512、AES和ECDSA在很长时间内其密码功能是调用OpenSSL实现的这也是为什么我们以Bitcoin客户端为例的原因。
需要替换的算法包括:
1. 将哈希算法SHA-256和SHA-512替换为国密SM3由于RIPEMD160特别用于生成160比特的输出因此暂不替换。
2. 将AES分组密码替换为国密SM4分组密码具体地将Bitcoin的AES-256-CBC加密替换为SM4-CBC加密。
3. 将ECDSA数字签名替换为国密SM2签名算法同时我们也将Bitcoin使用的椭圆曲线域参数替换为国密的推荐参数。
替换的过程如下:
首先下载、编译、安装最新的GmSSL代码。然后修改Bitcoin的源码
1. 在Bitcoin客户端源代码的C++文件和头文件中检索`SHA``RIPEMD``AES``ECDSA`等字符串。
2. 将源码中的`EVP_sha256``EVP_sha512`替换为`EVP_sm3`,将`SHA256_`前缀的函数替换为相应的`sm3_`函数。
3. 将源码中的`EVP_aes_256_cbc`替换为`EVP_sms4_cbc`
4. 将源码中的`ECDSA_sign/verify`等函数替换为相应的`SM2_sign/verify`函数。
5. 将源码中的曲线参数名`NID_secp256k1`替换为国密推荐参数名`NID_sm2p256v1`
在编辑完代码之后重新编译并且确保链接GmSSL的libcrypto库而不是系统自带的OpenSSL库。如果在编译过程中出现编译错误通过错误信息定位源码中修改不完善的位置。
通过编译的程序通常还会存在一些问题,例如程序的内部逻辑、数据格式、硬编码的数据、配置文件、测试数据、界面元素等都有可能和特定的算法相关,因此程序有可能无法正确执行。这需要进一步的修改,对软件的功能和用法越熟悉,迁移就越容易。