1、CryptoFramework是否支持“RSA ECB pkcs1padding”加密模式
A:支持该加密模式,HarmonyOS分组模式默认是ECB。
PKCS1:即RFC3447规范中的RSAES-PKCS1-V1_5模式,对应OpenSSL中的RSA_PKCS1_PADDING。
2、如何获取应用签名证书的hash值
A:如下
-
“应用指纹”signatureInfo.fingerprint是应用签名证书(.cer文件)的SHA-256hash值,当前支持获取本应用的“应用指纹”。
-
对于hash值,可使用加解密框架的hash算法,目前支持SHA1、SHA224、SHA256、SHA384、SHA512、MD5。
3、如何使用国密SM2算法进行加解密
A:加解密如下
加密
生成ECC密钥(公钥)。
当前SM2密钥生成的参数只支持封装并ASN.1序列化后的数据(公钥91字节,私钥51字节),而很多开发者使用的密钥数据是未封装序列化过的原始裸数据(公钥64字节,私钥32字节)。当前ECC密钥的生成是支持未封装序列化过的原始裸数据作为参数的,可以先使用原始密钥数据生成ECC密钥作为中间对象,然后将ECC密钥的数据作为参数来生成SM2密钥。
生成SM2密钥对象。
完成ECC的密钥对象创建后,下一步就是将ECC的密钥数据传入convertKey中来生成SM2密钥对象。
使用裸密钥执行SM2加密。
得到SM2密钥后,就可以使用cryptoFramework创建的cipher,执行SM2算法加密。
业务层封装调用,执行加密。
其中pubKey是未封装序列化过的原始裸数据公钥。最终返回的是标准SM2密文数据,符合ASN.1编码标准(base64编码)。
解密
将SM2裸密文数据转为标准的ASN.1序列化格式。
部分开发者的云端使用的密文格式为未封装序列化的裸数据,所以需要先根据SM2国标说明,编写代码,将裸密文数据转化为ASN.1序列化格式。
生成ECC密钥(私钥)。
与加密过程的生成ECC公钥类似,先使用原始私钥数据生成ECC加密的私钥;其中genSM2CommonSpec与加密时的方法相同。
生成SM2密钥对象。
与加密过程相同,使用genSM2Key方法,将ECC的私钥数据传入convertKey中来生成SM2密钥对象。
使用裸密钥执行SM2解密。
得到SM2密钥后,就可以使用cryptoFramework创建的cipher,执行SM2算法解密。
业务层封装调用,执行解密。
如下所示,如果需要解密裸密文,执行decryptSM2Array;如果待解密的是base64编码的符合ASN.1序列化的密文,则执行decryptSM2方法。其中priKey是未封装序列化过的原始裸数据私钥。最终返回解密后的字符串。
4、ECC算法是否支持secp256r1
A:ECC算法支持secp256r1,ECC256生成的就是secp256r1。
5、sm2公钥私对的getEncode().data返回的二进制数据是什么格式的
A:返回的是pkcs#8格式的私钥。
6、是否有AES的ECB模式的加密算法
A:有AES的ECB模式的加密算法,详情请参见:AES的ECB模式的加密算法
7、是否支持sm3算法
A:从API version 10开始, 支持sm3算法。参考链接:消息摘要计算。
8、如何使用Native计算MD5
A:HarmonyOS中有提供摘要算法,可参考消息摘要计算。
9、如何对大文件进行SM4加密
A:使用分段加解密,对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。最后doFinal的时候,会把剩下的还没加/解密的数据,根据createCipher时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。
10、AES的CBC加密,报错401
用AES256|CBC|PKCS5加密,在symKeyGenerator.convertKey时,报401参数错误,无法生成symKey
A:密钥是base64格式,转换时要用 const decryptKeyUint8Array = base.decodeSync(key);
11、如何实现RSA的公钥PK加密一段文字
A:算法库目前提供了RSA加解密常用的三种模式:NoPadding、PKCS1、PKCS1_OAEP。不同RSA密钥规格和不同填充方式支持加密的数据长度不同,详情见参考链接。
12、如何解决AES解密失败
使用cryptoFramework进行AES解密时,报错"doFinal failed"。
A:由于三方库版本问题,需要把根目录下oh-package.json5文件中 "@ohos/crypto-js"的版本号修改为 "2.0.3"。
更多详情查看:文档中心