GmSSL Android下实现。实现SM2/SM3/SM4对数据加密。如果该仓库对你有帮助的话,欢迎start
-
使用module 添加到自己的工程中。
git clone https://github.com/Cocoon-break/GmSSL-android cd GmSSL-android
将gmlib添加到自己工程中作为依赖module。该方式需要NDK,因为底层是由JNI实现。
-
直接使用release 中的aar包。
直接从release中下载aar包,添加到自己工程中。最小支持Android SDK minSdkVersion 21
具体的API使用参考MainActivity.java,同时MainActivity.java中也包含了对GBT 35275 数字信封格式的使用,具体使用直接看代码即可。
注:PKCS7 标准的中数字信封使用OID,是国际标准的。本工程中使用的是中国标准的,所以修改了GmSSL 表示OID中的源码编译的。修改方法直接粗暴的把OBJ_pkcs7_enveloped 的国际标准修改成中国标准的。
如果你想从零开始封装GmSSL。
-
编译armv7和arm64使用的libssl.a和libcrypto.a。
编译环境和编译脚本参考more
-
JNI封装
本工程使用JNI是使用的动态注册的方式实现。在我的RegisterJni工程中可参考学习。
本来数字信封和数字签名流程写在more中但是github的markdown不支持mermaid,我就手动截图一份
-
数字信封流程
GBT-35275 标准数字信封格式,具体使用参考MainActivity.java。
Server 生成非对称密钥的公钥和私钥:asymmetric_pub_key & asymmetric_pri_key
- Client 使用generateRandom(16),生成对称密钥。symmetric_key
- Client 使用symmetricEncrypt()和对称密钥,对明文进行加密。src_symmetric_en
- Client 使用publicKeyEncrypt()和Server的公钥,加密对称密钥。symmetric_key_en
- Client 将加密后的密文和加密后的对称密钥提供给Server端。
- Server使用publicKeyDecrypt()和Server的私钥,解密得道对称密钥。symmetric_key
- Server使用symmetricDecrypt()和对称密钥,解密密文得到明文。src
-
数字签名流程
Server 生成非对称密钥的公钥和私钥:asymmetric_pub_key & asymmetric_pri_key
- Client 使用digest(),对src 计算摘要。digest_src
- Client 使用sign()和Server公钥,对digest_src进行签名。digest_src_sign
- Client 将digest_src_sign 和 src 发送给Server
- Server 使用verify() 对digest_src_sign 和 digest_src进行验签。