未验证 提交 2d3cd775 编写于 作者: O openharmony_ci 提交者: Gitee

!19061 规范修改

Merge pull request !19061 from zengyawen/OpenHarmony-4.0-Beta1
...@@ -13,8 +13,10 @@ ...@@ -13,8 +13,10 @@
1. 随机生成算法库密钥对象。该对象可用于后续的加解密等操作。 1. 随机生成算法库密钥对象。该对象可用于后续的加解密等操作。
2. 根据指定数据生成算法库密钥对象(也就是将外部或存储的二进制数据转换为算法库的密钥对象)。该对象可用于后续的加解密等操作。 2. 根据指定数据生成算法库密钥对象(也就是将外部或存储的二进制数据转换为算法库的密钥对象)。该对象可用于后续的加解密等操作。
3. 获取算法库密钥对象的二进制数据,用于存储或传输。 3. 获取算法库密钥对象的二进制数据,用于存储或传输。
> **说明**:密钥对象Key包括对称密钥SymKey和非对称密钥(公钥PubKey和私钥PriKey),其中公钥和私钥组成密钥对KeyPair。密钥之间的具体关系可参考[API参考](../reference/apis/js-apis-cryptoFramework.md)。
> **说明:**
>
> 密钥对象Key包括对称密钥SymKey和非对称密钥(公钥PubKey和私钥PriKey),其中公钥和私钥组成密钥对KeyPair。密钥之间的具体关系可参考[API参考](../reference/apis/js-apis-cryptoFramework.md)。
**接口及参数说明** **接口及参数说明**
...@@ -46,7 +48,7 @@ ...@@ -46,7 +48,7 @@
以使用Promise方式随机生成RSA密钥(1024位,素数个数为2)为例: 以使用Promise方式随机生成RSA密钥(1024位,素数个数为2)为例:
```javascript ```js
import cryptoFramework from '@ohos.security.cryptoFramework'; import cryptoFramework from '@ohos.security.cryptoFramework';
function generateAsyKey() { function generateAsyKey() {
...@@ -75,7 +77,7 @@ function generateAsyKey() { ...@@ -75,7 +77,7 @@ function generateAsyKey() {
以使用Promise方式随机生成AES密钥(256位)为例: 以使用Promise方式随机生成AES密钥(256位)为例:
```javascript ```js
import cryptoFramework from '@ohos.security.cryptoFramework'; import cryptoFramework from '@ohos.security.cryptoFramework';
// 字节流以16进制输出 // 字节流以16进制输出
...@@ -103,7 +105,7 @@ function testGenerateAesKey() { ...@@ -103,7 +105,7 @@ function testGenerateAesKey() {
1. 获取RSA公钥或私钥二进制数据,公钥需满足ASN.1语法、X.509规范、DER编码格式,私钥需满足ASN.1语法、PKCS#8规范、DER编码格式。 1. 获取RSA公钥或私钥二进制数据,公钥需满足ASN.1语法、X.509规范、DER编码格式,私钥需满足ASN.1语法、PKCS#8规范、DER编码格式。
2. 创建AsyKeyGenerator对象,调用convertKey方法,传入公钥二进制和私钥二进制(二者非必选项,可只传入其中一个),转换为KeyPair对象。 2. 创建AsyKeyGenerator对象,调用convertKey方法,传入公钥二进制和私钥二进制(二者非必选项,可只传入其中一个),转换为KeyPair对象。
```javascript ```js
import cryptoFramework from '@ohos.security.cryptoFramework'; import cryptoFramework from '@ohos.security.cryptoFramework';
function convertAsyKey() { function convertAsyKey() {
...@@ -119,16 +121,16 @@ function convertAsyKey() { ...@@ -119,16 +121,16 @@ function convertAsyKey() {
} }
``` ```
**说明** > **说明:**
>
当前convertKey操作,公钥只支持转换满足X.509规范的DER格式,私钥只支持PKCS#8规范的DER格式; > 当前convertKey操作,公钥只支持转换满足X.509规范的DER格式,私钥只支持PKCS#8规范的DER格式。
示例4:根据指定的ECC非对称密钥二进制数据,生成KeyPair对象(场景2、3) 示例4:根据指定的ECC非对称密钥二进制数据,生成KeyPair对象(场景2、3)
1. 获取ECC二进制密钥数据,封装成DataBlob对象。 1. 获取ECC二进制密钥数据,封装成DataBlob对象。
2. 调用convertKey方法,传入公钥二进制和私钥二进制(二者非必选项,可只传入其中一个),转换为KeyPair对象。 2. 调用convertKey方法,传入公钥二进制和私钥二进制(二者非必选项,可只传入其中一个),转换为KeyPair对象。
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function convertEccAsyKey() { function convertEccAsyKey() {
...@@ -154,7 +156,7 @@ function convertEccAsyKey() { ...@@ -154,7 +156,7 @@ function convertEccAsyKey() {
以使用callback方式生成3DES密钥(3DES密钥只能为192位)为例: 以使用callback方式生成3DES密钥(3DES密钥只能为192位)为例:
```javascript ```js
import cryptoFramework from '@ohos.security.cryptoFramework'; import cryptoFramework from '@ohos.security.cryptoFramework';
// 字节流以16进制输出 // 字节流以16进制输出
...@@ -201,12 +203,15 @@ function testConvertAesKey() { ...@@ -201,12 +203,15 @@ function testConvertAesKey() {
**场景说明** **场景说明**
在数据存储或传输场景中,可以使用加解密操作用于保证数据的机密性,防止敏感数据泄露。使用加解密操作中,典型的场景有: 在数据存储或传输场景中,可以使用加解密操作用于保证数据的机密性,防止敏感数据泄露。使用加解密操作中,典型的场景有:
1. 使用对称密钥的加解密操作 1. 使用对称密钥的加解密操作
2. 使用非对称密钥的加解密操作 2. 使用非对称密钥的加解密操作
**接口及参数说明** **接口及参数说明**
详细接口说明可参考[API参考](../reference/apis/js-apis-cryptoFramework.md)<br/>由于密码算法的复杂性,在选取不同规格和参数时,开发差异较大,无法通过代码示例一一列举,请仔细阅读API参考资料中的相关接口,确保使用正确。 详细接口说明可参考[API参考](../reference/apis/js-apis-cryptoFramework.md)
由于密码算法的复杂性,在选取不同规格和参数时,开发差异较大,无法通过代码示例一一列举,请仔细阅读API参考资料中的相关接口,确保使用正确。
以上场景设计的常用接口如下表所示: 以上场景设计的常用接口如下表所示:
...@@ -490,9 +495,10 @@ function test3DesEcb() { ...@@ -490,9 +495,10 @@ function test3DesEcb() {
} }
} }
``` ```
以AES GCM以promise方式,分段update()实现加解密为例: 以AES GCM以promise方式,分段update()实现加解密为例:
```javascript ```js
import cryptoFramework from '@ohos.security.cryptoFramework'; import cryptoFramework from '@ohos.security.cryptoFramework';
var globalCipher; var globalCipher;
...@@ -638,7 +644,7 @@ function testAesMultiUpdate() { ...@@ -638,7 +644,7 @@ function testAesMultiUpdate() {
2. 生成Cipher对象。通过createCipher接口创建Cipher对象,执行初始化操作,设置密钥及加解密模式。 2. 生成Cipher对象。通过createCipher接口创建Cipher对象,执行初始化操作,设置密钥及加解密模式。
3. 执行加解密操作。通过调用Cipher对象提供的doFinal接口,执行加密操作生成密文或执行解密操作生成明文。 3. 执行加解密操作。通过调用Cipher对象提供的doFinal接口,执行加密操作生成密文或执行解密操作生成明文。
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
let plan = "This is cipher test."; let plan = "This is cipher test.";
...@@ -738,8 +744,10 @@ function decryptMessageCallback() { ...@@ -738,8 +744,10 @@ function decryptMessageCallback() {
}); });
} }
``` ```
以RSA非对称加解密(多次调用doFinal实现分段)为例: 以RSA非对称加解密(多次调用doFinal实现分段)为例:
```javascript
```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function stringToUint8Array(str) { function stringToUint8Array(str) {
...@@ -823,17 +831,18 @@ function encryptLongMessagePromise() { ...@@ -823,17 +831,18 @@ function encryptLongMessagePromise() {
} }
``` ```
**说明** > **说明:**
>
1. 使用RSA加解密时,Cipher对象不可重复调用init方法初始化,在创建了一个加密Cipher对象后,如果要进行解密,则需要重新创建另一个Cipher对象执行解密操作。 > 1. 使用RSA加解密时,Cipher对象不可重复调用init方法初始化,在创建了一个加密Cipher对象后,如果要进行解密,则需要重新创建另一个Cipher对象执行解密操作。
2. RSA加密有长度限制,允许加密明文的最大长度见[加解密算法库框架概述](cryptoFramework-overview.md)中的基本概念章节。 > 2. RSA加密有长度限制,允许加密明文的最大长度见[加解密算法库框架概述](cryptoFramework-overview.md)中的基本概念章节。
3. RSA解密每次允许解密的密文长度为,RSA密钥的位数/8。 > 3. RSA解密每次允许解密的密文长度为,RSA密钥的位数/8。
## 使用签名验签操作 ## 使用签名验签操作
**场景说明** **场景说明**
当需要判断接收的数据是否被篡改且是否为指定对象发送的数据时,可以使用签名验签操作。使用签名验签操作中,典型的场景有: 当需要判断接收的数据是否被篡改且是否为指定对象发送的数据时,可以使用签名验签操作。使用签名验签操作中,典型的场景有:
1. 使用RSA签名验签操作 1. 使用RSA签名验签操作
2. 使用ECC签名验签操作 2. 使用ECC签名验签操作
...@@ -861,21 +870,23 @@ function encryptLongMessagePromise() { ...@@ -861,21 +870,23 @@ function encryptLongMessagePromise() {
**开发步骤** **开发步骤**
示例1:使用RSA签名验签操作 示例1:使用RSA签名验签操作
1. 生成RSA密钥。通过createAsyKeyGenerator接口创建AsyKeyGenerator对象,并生成RSA非对称密钥。 1. 生成RSA密钥。通过createAsyKeyGenerator接口创建AsyKeyGenerator对象,并生成RSA非对称密钥。
2. 生成Sign对象。通过createSign接口创建Sign对象,执行初始化操作并设置签名私钥。 2. 生成Sign对象。通过createSign接口创建Sign对象,执行初始化操作并设置签名私钥。
3. 执行签名操作。通过Sign类提供的update接口,添加签名数据,并调用sign接口生成数据的签名。 3. 执行签名操作。通过Sign类提供的update接口,添加签名数据,并调用sign接口生成数据的签名。
4. 生成Verify对象。通过createVerify接口创建Verify对象,执行初始化操作并设置验签公钥。 4. 生成Verify对象。通过createVerify接口创建Verify对象,执行初始化操作并设置验签公钥。
5. 执行验签操作。通过Verify类提供的update接口,添加签名数据,并调用verify接口传入签名进行验签。 5. 执行验签操作。通过Verify类提供的update接口,添加签名数据,并调用verify接口传入签名进行验签。
```javascript
```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function stringToUint8Array(str) { function stringToUint8Array(str) {
var arr = []; var arr = [];
for (var i = 0, j = str.length; i < j; ++i) { for (var i = 0, j = str.length; i < j; ++i) {
arr.push(str.charCodeAt(i)); arr.push(str.charCodeAt(i));
} }
var tmpArray = new Uint8Array(arr); var tmpArray = new Uint8Array(arr);
return tmpArray; return tmpArray;
} }
let globalKeyPair; let globalKeyPair;
...@@ -945,22 +956,23 @@ function verifyMessageCallback() { ...@@ -945,22 +956,23 @@ function verifyMessageCallback() {
``` ```
示例2:使用ECDSA操作 示例2:使用ECDSA操作
1. 生成ECC密钥。通过createAsyKeyGenerator接口创建AsyKeyGenerator对象,并生成ECC非对称密钥。 1. 生成ECC密钥。通过createAsyKeyGenerator接口创建AsyKeyGenerator对象,并生成ECC非对称密钥。
2. 生成Sign对象。通过createSign接口创建Sign对象,执行初始化操作并设置签名私钥。 2. 生成Sign对象。通过createSign接口创建Sign对象,执行初始化操作并设置签名私钥。
3. 执行签名操作。通过Sign类提供的update接口,添加签名数据,并调用doFinal接口生成数据的签名。 3. 执行签名操作。通过Sign类提供的update接口,添加签名数据,并调用doFinal接口生成数据的签名。
4. 生成Verify对象。通过createVerify接口创建Verify对象,执行初始化操作并设置验签公钥。 4. 生成Verify对象。通过createVerify接口创建Verify对象,执行初始化操作并设置验签公钥。
5. 执行验签操作。通过Verify类提供的update接口,添加签名数据,并调用doFinal接口传入签名进行验签。 5. 执行验签操作。通过Verify类提供的update接口,添加签名数据,并调用doFinal接口传入签名进行验签。
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function stringToUint8Array(str) { function stringToUint8Array(str) {
var arr = []; var arr = [];
for (var i = 0, j = str.length; i < j; ++i) { for (var i = 0, j = str.length; i < j; ++i) {
arr.push(str.charCodeAt(i)); arr.push(str.charCodeAt(i));
} }
var tmpArray = new Uint8Array(arr); var tmpArray = new Uint8Array(arr);
return tmpArray; return tmpArray;
} }
let globalKeyPair; let globalKeyPair;
...@@ -1028,9 +1040,10 @@ function verifyMessageCallback() { ...@@ -1028,9 +1040,10 @@ function verifyMessageCallback() {
}) })
} }
``` ```
以执行签名、验签操作时多次调用update实现分段为例: 以执行签名、验签操作时多次调用update实现分段为例:
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function stringToUint8Array(str) { function stringToUint8Array(str) {
...@@ -1127,7 +1140,7 @@ function signLongMessagePromise() { ...@@ -1127,7 +1140,7 @@ function signLongMessagePromise() {
3. 通过接口`digest`,返回摘要计算结果 3. 通过接口`digest`,返回摘要计算结果
4. 获取当前摘要算法名与摘要计算长度 4. 获取当前摘要算法名与摘要计算长度
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
// 可理解的字符串转成字节流 // 可理解的字符串转成字节流
...@@ -1198,8 +1211,10 @@ function doMdByCallback() { ...@@ -1198,8 +1211,10 @@ function doMdByCallback() {
}); });
} }
``` ```
以MD更新时多次调用update实现分段为例: 以MD更新时多次调用update实现分段为例:
```javascript
```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
// 可理解的字符串转成字节流 // 可理解的字符串转成字节流
...@@ -1281,7 +1296,7 @@ async function doLoopMdPromise() { ...@@ -1281,7 +1296,7 @@ async function doLoopMdPromise() {
1. 通过createKeyAgreement接口创建KeyAgreement对象,用于后续的密钥协商操作。 1. 通过createKeyAgreement接口创建KeyAgreement对象,用于后续的密钥协商操作。
2. 调用KeyAgreement对象提供的generateSecret方法,传入对端的ECC公钥对象,以及本地生成的ECC私钥对象。 2. 调用KeyAgreement对象提供的generateSecret方法,传入对端的ECC公钥对象,以及本地生成的ECC私钥对象。
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
let globalSelfPriKey; let globalSelfPriKey;
...@@ -1360,7 +1375,7 @@ Mac(message authentication code)可以对消息进行完整性校验,通过使 ...@@ -1360,7 +1375,7 @@ Mac(message authentication code)可以对消息进行完整性校验,通过使
4. 通过接口`doFinal`,返回Mac计算结果 4. 通过接口`doFinal`,返回Mac计算结果
5. 获取当前摘要算法名与Mac计算长度 5. 获取当前摘要算法名与Mac计算长度
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
// 可理解的字符串转成字节流 // 可理解的字符串转成字节流
...@@ -1457,8 +1472,10 @@ function doHmacByCallback() { ...@@ -1457,8 +1472,10 @@ function doHmacByCallback() {
}); });
} }
``` ```
以HMAC更新MAC时多次调用update实现分段为例: 以HMAC更新MAC时多次调用update实现分段为例:
```javascript
```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
function stringToUint8Array(str) { function stringToUint8Array(str) {
...@@ -1528,7 +1545,6 @@ function doLoopHmacPromise() { ...@@ -1528,7 +1545,6 @@ function doLoopHmacPromise() {
} }
``` ```
## 使用随机数操作 ## 使用随机数操作
**场景说明** **场景说明**
...@@ -1555,7 +1571,7 @@ function doLoopHmacPromise() { ...@@ -1555,7 +1571,7 @@ function doLoopHmacPromise() {
2. 接受输入长度,通过接口`generateRandom`,生成指定长度的随机数 2. 接受输入长度,通过接口`generateRandom`,生成指定长度的随机数
3. 接受DataBlob数据,通过接口`setSeed`,为随机数生成池设置种子 3. 接受DataBlob数据,通过接口`setSeed`,为随机数生成池设置种子
```javascript ```js
import cryptoFramework from "@ohos.security.cryptoFramework" import cryptoFramework from "@ohos.security.cryptoFramework"
// process by promise // process by promise
......
# 加解密算法库框架概述 # 加解密算法库框架概述
加解密算法库框架是一个屏蔽了第三方密码学算法库实现差异的算法框架,提供加解密、签名验签、消息验证码、哈希、安全随机数等相关功能。开发者可以通过调用加解密算法库框架,忽略底层不同三方算法库的差异,实现迅捷开发。 加解密算法库框架是一个屏蔽了第三方密码学算法库实现差异的算法框架,提供加解密、签名验签、消息验证码、哈希、安全随机数等相关功能。开发者可以通过调用加解密算法库框架,忽略底层不同三方算法库的差异,实现迅捷开发。
> **说明:** 加解密算法库框架仅提供密钥的密码学操作,而不提供密钥管理功能。因此,使用算法库时,需要应用自己来保管密钥(适用于临时会话密钥等仅在内存中使用的场景,或者应用自己实现密钥安全存储的场景)。如果业务需要由系统提供密钥管理功能(密钥存储等),请使用[HUKS部件](huks-overview.md)。 > **说明:**
>
> 加解密算法库框架仅提供密钥的密码学操作,而不提供密钥管理功能。因此,使用算法库时,需要应用自己来保管密钥(适用于临时会话密钥等仅在内存中使用的场景,或者应用自己实现密钥安全存储的场景)。如果业务需要由系统提供密钥管理功能(密钥存储等),请使用[HUKS部件](huks-overview.md)。
## 框架实现原理 ## 框架实现原理
加解密算法库框架提供的组件分为三层:接口层,Framework层和插件层。接口层负责对外提供统一的JS接口,插件层实现针对具体三方算法库的功能,Framework层通过灵活加载插件层的插件适配并屏蔽三方算法库差异。 加解密算法库框架提供的组件分为三层:接口层,Framework层和插件层。接口层负责对外提供统一的JS接口,插件层实现针对具体三方算法库的功能,Framework层通过灵活加载插件层的插件适配并屏蔽三方算法库差异。
## 基本概念 ## 基本概念
**对称密钥** **对称密钥**
对称密钥使用同一个密钥对数据进行加密解密操作。即对称加密算法中,数据发送方使用加密密钥对明文进行特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用同一个加密密钥以及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。 对称密钥使用同一个密钥对数据进行加密解密操作。即对称加密算法中,数据发送方使用加密密钥对明文进行特殊加密算法处理后,使其变成复杂的加密密文发送出去。接收方收到密文后,若想解读原文,则需要使用同一个加密密钥以及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
...@@ -14,6 +18,7 @@ ...@@ -14,6 +18,7 @@
- **AES加密** - **AES加密**
AES的全称是Advanced Encryption Standard,是最常见的对称加密。AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。 AES的全称是Advanced Encryption Standard,是最常见的对称加密。AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。
- **3DES加密** - **3DES加密**
3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据块应用三次DES的对称加密算法,它使用3个64位的密钥对数据块进行三次加密。相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。 3DES,也称为 3DESede 或 TripleDES,是三重数据加密算法,相当于是对每个数据块应用三次DES的对称加密算法,它使用3个64位的密钥对数据块进行三次加密。相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。
...@@ -27,6 +32,7 @@ ...@@ -27,6 +32,7 @@
RSA密钥以极大整数做因数分解的数学难题作为密钥安全性的基石。生成密钥时,首先需要随机出两个大素数p和q,计算n = p * q并将n做为模,再选择一个大于1且小于(p - 1) * (q - 1)的整数e,确保e与(p - 1)*(q - 1)互素,最后计算d,使得e * d - 1为(p - 1)和(q - 1)的倍数,则可得到公钥(n, e)和私钥(n, d)。 RSA密钥以极大整数做因数分解的数学难题作为密钥安全性的基石。生成密钥时,首先需要随机出两个大素数p和q,计算n = p * q并将n做为模,再选择一个大于1且小于(p - 1) * (q - 1)的整数e,确保e与(p - 1)*(q - 1)互素,最后计算d,使得e * d - 1为(p - 1)和(q - 1)的倍数,则可得到公钥(n, e)和私钥(n, d)。
算法库框架除提供了默认的双素数RSA密钥生成外,还提供了多素数密钥生成方式,可以在密钥生成时通过指定primes参数(PRIMES_2, PRIMES_3, PRIMES_4, PRIMES_5)指定素数个数。多素数密钥的优点是可以减少解密、签名的计算量(中国剩余定理),但相对的劣势是密钥强度会越低,算法库依据OpenSSL的素数使用规则制定了相应规格,具体将在**约束与限制**章节中说明。 算法库框架除提供了默认的双素数RSA密钥生成外,还提供了多素数密钥生成方式,可以在密钥生成时通过指定primes参数(PRIMES_2, PRIMES_3, PRIMES_4, PRIMES_5)指定素数个数。多素数密钥的优点是可以减少解密、签名的计算量(中国剩余定理),但相对的劣势是密钥强度会越低,算法库依据OpenSSL的素数使用规则制定了相应规格,具体将在**约束与限制**章节中说明。
- **ECC密钥** - **ECC密钥**
ECC是一种基于椭圆曲线数学的公开密钥加密算法,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性,算法库框架提供了多种椭圆曲线的ECC密钥生成能力。 ECC是一种基于椭圆曲线数学的公开密钥加密算法,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性,算法库框架提供了多种椭圆曲线的ECC密钥生成能力。
...@@ -36,38 +42,47 @@ ...@@ -36,38 +42,47 @@
- **对称AES加解密** - **对称AES加解密**
算法库目前提供了AES加解密常用的7种加密模式:ECB、CBC、OFB、CFB、CTR、GCM和CCM。AES为分组加密算法,分组长度大小为128位。实际应用中明文最后一组可能不足128位,不足数据可以使用各种padding模式做数据填充。下文中描述了各个padding的区别: 算法库目前提供了AES加解密常用的7种加密模式:ECB、CBC、OFB、CFB、CTR、GCM和CCM。AES为分组加密算法,分组长度大小为128位。实际应用中明文最后一组可能不足128位,不足数据可以使用各种padding模式做数据填充。下文中描述了各个padding的区别:
- NoPadding:不带填充; - NoPadding:不带填充。
- PKCS5:填充字符由一个字节序列组成,每个字节填充该填充字节序列的长度,规定是8字节填充; - PKCS5:填充字符由一个字节序列组成,每个字节填充该填充字节序列的长度,规定是8字节填充。
- PKCS7:填充字符和PKCS5填充方法一致,但是可以在1-255字节之间任意填充; - PKCS7:填充字符和PKCS5填充方法一致,但是可以在1-255字节之间任意填充。
> **说明:** ECB、CBC加密模式,明文长度不是128位整数倍,必须使用填充方法补足。<br/>由于需要填充至分组大小,所以实际算法库中的PKCS5和PKCS7都是以分组大小作为填充长度的,即AES加密填充至16字节。 > **说明:**
>
> ECB、CBC加密模式,明文长度不是128位整数倍,必须使用填充方法补足。<br/>
> 由于需要填充至分组大小,所以实际算法库中的PKCS5和PKCS7都是以分组大小作为填充长度的,即AES加密填充至16字节。
- **对称3DES加解密** - **对称3DES加解密**
该算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。 该算法的加解密过程分别是对明文/密文数据进行三次DES加密或解密,得到相应的密文或明文。
算法库目前提供了3DES加解密常用的4种加密模式:ECB、CBC、OFB和CFB。DES为分组加密算法,分组长度大小为64位。实际应用中明文最后一组可能不足64位,不足数据可以使用各种padding模式做数据填充。下文中描述了各个padding的区别: 算法库目前提供了3DES加解密常用的4种加密模式:ECB、CBC、OFB和CFB。DES为分组加密算法,分组长度大小为64位。实际应用中明文最后一组可能不足64位,不足数据可以使用各种padding模式做数据填充。下文中描述了各个padding的区别:
- NoPadding:不带填充; - NoPadding:不带填充。
- PKCS5:填充字符由一个字节序列组成,每个字节填充该填充字节序列的长度,规定是8字节填充; - PKCS5:填充字符由一个字节序列组成,每个字节填充该填充字节序列的长度,规定是8字节填充。
- PKCS7:填充字符和PKCS5填充方法一致,但是可以在1-255字节之间任意填充; - PKCS7:填充字符和PKCS5填充方法一致,但是可以在1-255字节之间任意填充。
> **说明:** ECB、CBC加密模式,明文长度不是64位整数倍,必须使用填充方法补足。<br/>由于需要填充至分组大小,所以实际算法库中的PKCS5和PKCS7都是以分组大小作为填充长度的,即3DES加密填充至8字节。 > **说明:**
>
> ECB、CBC加密模式,明文长度不是64位整数倍,必须使用填充方法补足。<br/>
> 由于需要填充至分组大小,所以实际算法库中的PKCS5和PKCS7都是以分组大小作为填充长度的,即3DES加密填充至8字节。
- **非对称RSA加解密** - **非对称RSA加解密**
当持有RSA公钥(n, e)和私钥(n, d)后,RSA加密过程为:密文 = 明文 ^ e mod n, 解密过程为:明文 = 密文 ^ d mod n。算法库目前提供了RSA加解密常用的三种模式:PKCS1、PKCS1_OAEP和NoPadding。RSA为块加密算法,加密长度需要在固定长度进行,实际应用中会使用各种padding模式做数据填充。下文中描述了各个padding的区别: 当持有RSA公钥(n, e)和私钥(n, d)后,RSA加密过程为:密文 = 明文 ^ e mod n, 解密过程为:明文 = 密文 ^ d mod n。算法库目前提供了RSA加解密常用的三种模式:PKCS1、PKCS1_OAEP和NoPadding。RSA为块加密算法,加密长度需要在固定长度进行,实际应用中会使用各种padding模式做数据填充。下文中描述了各个padding的区别:
- NoPadding:不带填充,输入的数据必须与RSA钥模一样长,输出数据长度与RSA钥模一样长; - NoPadding:不带填充,输入的数据必须与RSA钥模一样长,输出数据长度与RSA钥模一样长。
- PKCS1:pkcs1padding V1.5是RSA加解密默认的填充方式,输入的数据必须<=RSA钥模-11,输出数据长度与RSA钥模一样长; - PKCS1:pkcs1padding V1.5是RSA加解密默认的填充方式,输入的数据必须<=RSA钥模-11,输出数据长度与RSA钥模一样长。
- PKCS1_OAEP:RSA_PKCS1_OAEP_PADDING填充模式是PKCS#1推出的新填充方式,此模式需要设置两个摘要(md和mgf1_md),输入的数据必须小于RSA钥模 - md摘要长度 - mgf1_md摘要长度 - 2,输出数据长度与RSA钥模一样长;<br/> - PKCS1_OAEP:RSA_PKCS1_OAEP_PADDING填充模式是PKCS#1推出的新填充方式,此模式需要设置两个摘要(md和mgf1_md),输入的数据必须小于RSA钥模 - md摘要长度 - mgf1_md摘要长度 - 2,输出数据长度与RSA钥模一样长。
**补充说明:** RSA钥模 = (RSA的bits + 7) / 8 > **说明:**
>
> RSA钥模 = (RSA的bits + 7) / 8
**签名验签** **签名验签**
- **RSA签名验签** - **RSA签名验签**
当持有RSA公钥(n, e)和私钥(n, d)后,RSA签名生成过程为:签名 = 消息 ^ d mod n, 验签过程为:消息 = 签名 ^ d mod n。消息发送方发送数据时,同时发送消息和私钥签名后的签名信息,消息接收方接受到数据后,将签名信息用公钥解密并验证消息是否一致。因发送的消息长度大多大于RSA钥模,因此算法库框架提供了两种padding模式,通过摘要提取消息的散列值再做签名。算法库框架中提供了签名验签相关的两种模式:PKCS1和PSS。下问对两种模式做详细描述: 当持有RSA公钥(n, e)和私钥(n, d)后,RSA签名生成过程为:签名 = 消息 ^ d mod n, 验签过程为:消息 = 签名 ^ d mod n。消息发送方发送数据时,同时发送消息和私钥签名后的签名信息,消息接收方接受到数据后,将签名信息用公钥解密并验证消息是否一致。因发送的消息长度大多大于RSA钥模,因此算法库框架提供了两种padding模式,通过摘要提取消息的散列值再做签名。算法库框架中提供了签名验签相关的两种模式:PKCS1和PSS。下问对两种模式做详细描述:
- PKCS1: pkcs1padding V1.5是RSA加解密默认的填充方式,使用该模式时需要设置摘要(md); - PKCS1: pkcs1padding V1.5是RSA加解密默认的填充方式,使用该模式时需要设置摘要(md)。
- PSS: PSS模式是RSA 算法的基础上叠加上一种填充算法,使用该签名算法时需要使用摘要(md)和掩码函数(mgf1_md); - PSS: PSS模式是RSA 算法的基础上叠加上一种填充算法,使用该签名算法时需要使用摘要(md)和掩码函数(mgf1_md)。
- **ECDSA** - **ECDSA**
椭圆曲线数字签名算法(ECDSA)是基于椭圆曲线密码(ECC)模拟数字签名算法(DSA)。相比普通的离散对数问题(DLP)和大数分解问题(IFP),椭圆曲线密码的单位比特强度要高于其他公钥体制。算法库框架提供了多种椭圆曲线及摘要算法组合的椭圆曲线数字签名算法(ECDSA)能力。 椭圆曲线数字签名算法(ECDSA)是基于椭圆曲线密码(ECC)模拟数字签名算法(DSA)。相比普通的离散对数问题(DLP)和大数分解问题(IFP),椭圆曲线密码的单位比特强度要高于其他公钥体制。算法库框架提供了多种椭圆曲线及摘要算法组合的椭圆曲线数字签名算法(ECDSA)能力。
...@@ -83,9 +98,9 @@ ...@@ -83,9 +98,9 @@
消息摘要MD算法是一种能将任意长度的输入消息,通过哈希算法生成长度固定的摘要的算法。消息摘要算法通过其不可逆的特性能被用于敏感信息的加密。消息摘要算法也被称为哈希算法或单向散列算法。 消息摘要MD算法是一种能将任意长度的输入消息,通过哈希算法生成长度固定的摘要的算法。消息摘要算法通过其不可逆的特性能被用于敏感信息的加密。消息摘要算法也被称为哈希算法或单向散列算法。
在摘要算法相同时,生成的摘要值主要有下列特点: 在摘要算法相同时,生成的摘要值主要有下列特点:
- 当输入消息相同时,生成摘要序列相同 - 当输入消息相同时,生成摘要序列相同
- 当输入消息的长度不一致时,生成摘要序列长度固定(摘要长度由算法决定) - 当输入消息的长度不一致时,生成摘要序列长度固定(摘要长度由算法决定)
- 当输入消息不一致时,生成摘要序列几乎不会相同(依然存在相同概率,由摘要长度决定相同概率) - 当输入消息不一致时,生成摘要序列几乎不会相同(依然存在相同概率,由摘要长度决定相同概率)
消息摘要算法主要分为三类:MD,SHA与MAC(详见HMAC章节) 消息摘要算法主要分为三类:MD,SHA与MAC(详见HMAC章节)
MD算法包括MD2,MD4和MD5。 MD算法包括MD2,MD4和MD5。
...@@ -102,7 +117,6 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息 ...@@ -102,7 +117,6 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息
- **内部状态**代表随机数生成器内存中的数值,当内部状态相同时,随机数生成器会生成固定的随机数序列 - **内部状态**代表随机数生成器内存中的数值,当内部状态相同时,随机数生成器会生成固定的随机数序列
- **种子**(seed)是一个用来对伪随机数的内部状态进行初始化的数据,随机数生成器通过种子来生成一系列的随机序列。 - **种子**(seed)是一个用来对伪随机数的内部状态进行初始化的数据,随机数生成器通过种子来生成一系列的随机序列。
## 约束与限制 ## 约束与限制
- 算法库框架不支持多线程并发操作。 - 算法库框架不支持多线程并发操作。
...@@ -121,9 +135,12 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息 ...@@ -121,9 +135,12 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息
|AES|192|AES192| |AES|192|AES192|
|AES|256|AES256| |AES|256|AES256|
> **说明**:“字符串参数”是“对称密钥算法”和“密钥长度”拼接而成,用于在创建对称密钥生成器时,指定密钥规格。 > **说明:**
>
> “字符串参数”是“对称密钥算法”和“密钥长度”拼接而成,用于在创建对称密钥生成器时,指定密钥规格。
**非对称密钥生成规格** **非对称密钥生成规格**
- **RSA密钥生成** - **RSA密钥生成**
支持的非对称密钥生成参数: 支持的非对称密钥生成参数:
...@@ -146,7 +163,9 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息 ...@@ -146,7 +163,9 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息
|RSA8192|4|RSA8192\|PRIMES_4| |RSA8192|4|RSA8192\|PRIMES_4|
|RSA8192|5|RSA8192\|PRIMES_5| |RSA8192|5|RSA8192\|PRIMES_5|
> **说明**:生成RSA非对称密钥时,默认素数为2,PRIMES_2参数可省略。 > **说明:**
>
> 生成RSA非对称密钥时,默认素数为2,PRIMES_2参数可省略。
- **ECC密钥生成** - **ECC密钥生成**
...@@ -179,14 +198,15 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息 ...@@ -179,14 +198,15 @@ HMAC(Hash-based Message Authentication Code)是一种基于密钥的消息
|AES|GCM|AES[128\|192\|256]\|GCM\|[NoPadding\|PKCS5\|PKCS7]| |AES|GCM|AES[128\|192\|256]\|GCM\|[NoPadding\|PKCS5\|PKCS7]|
|AES|CCM|AES[128\|192\|256]\|CCM\|[NoPadding\|PKCS5\|PKCS7]| |AES|CCM|AES[128\|192\|256]\|CCM\|[NoPadding\|PKCS5\|PKCS7]|
> **说明:** > **说明:**
> >
> 1. []中只能任选一项。 > 1. []中只能任选一项。
> 2. “字符串参数”是“对称加解密算法(含密钥长度)”、“分组模式”、“填充模式”拼接而成,用于在创建对称加解密实例时,指定对称加解密算法规格。 > 2. “字符串参数”是“对称加解密算法(含密钥长度)”、“分组模式”、“填充模式”拼接而成,用于在创建对称加解密实例时,指定对称加解密算法规格。
**非对称RSA加解密** **非对称RSA加解密**
RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。 RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。
- 使用NoPadding模式时可以指定的参数: - 使用NoPadding模式时可以指定的参数:
|非对称密钥类型| 填充模式 | 字符串参数 | |非对称密钥类型| 填充模式 | 字符串参数 |
...@@ -199,7 +219,7 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。 ...@@ -199,7 +219,7 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。
|RSA4096|NoPadding|RSA4096\|NoPadding| |RSA4096|NoPadding|RSA4096\|NoPadding|
|RSA8192|NoPadding|RSA8192\|NoPadding| |RSA8192|NoPadding|RSA8192\|NoPadding|
- 使用PKCS1模式时可以指定的参数: - 使用PKCS1模式时可以指定的参数:
|非对称密钥类型| 填充模式 | 字符串参数 | |非对称密钥类型| 填充模式 | 字符串参数 |
|---|---|---| |---|---|---|
...@@ -212,11 +232,12 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。 ...@@ -212,11 +232,12 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。
|RSA8192|PKCS1|RSA8192\|PKCS1| |RSA8192|PKCS1|RSA8192\|PKCS1|
- 使用PKCS1_OAEP模式时可以指定的参数: - 使用PKCS1_OAEP模式时可以指定的参数:
> **说明:**
> > **说明:**
> 1.[]内的参数只能任选一项,非[]内的为固定值; >
> 2.使用时请从表格中选择非对称密钥类型、填充模式、摘要、掩码摘要四个数据,用|拼接成字符串。 > 1. []内的参数只能任选一项,非[]内的为固定值;
> 例如:"RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA256" > 2. 使用时请从表格中选择非对称密钥类型、填充模式、摘要、掩码摘要四个数据,用|拼接成字符串。<br>
> 例如:"RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA256"
| 非对称密钥类型 | 填充模式 | 摘要 | 掩码摘要 | | 非对称密钥类型 | 填充模式 | 摘要 | 掩码摘要 |
|---|---|---|---| |---|---|---|---|
...@@ -261,13 +282,13 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。 ...@@ -261,13 +282,13 @@ RSA加解密时,涉及三种填充模式:NoPadding, PKCS1和PKCS1_OAEP。
|RSA8192|PKCS1_OAEP|SHA384|[MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512]| |RSA8192|PKCS1_OAEP|SHA384|[MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512]|
|RSA8192|PKCS1_OAEP|SHA512|[MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512]| |RSA8192|PKCS1_OAEP|SHA512|[MGF1_MD5\|MGF1_SHA1\|MGF1_SHA224\|MGF1_SHA256\|MGF1_SHA384\|MGF1_SHA512]|
### 签名验签规格 ### 签名验签规格
**RSA签名验签** **RSA签名验签**
RSA签名验签时,涉及两种填充模式:PKCS1和PSS。 RSA签名验签时,涉及两种填充模式:PKCS1和PSS。
- 使用PKCS1模式时可以指定的参数:
- 使用PKCS1模式时可以指定的参数:
| 非对称密钥类型 | 填充模式 | 摘要 | 字符串参数 | | 非对称密钥类型 | 填充模式 | 摘要 | 字符串参数 |
|---|---|---|---| |---|---|---|---|
...@@ -280,11 +301,11 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。 ...@@ -280,11 +301,11 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。
|RSA8192|PKCS1|[MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512]|RSA8192\|PKCS1\|[MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512]| |RSA8192|PKCS1|[MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512]|RSA8192\|PKCS1\|[MD5\|SHA1\|SHA224\|SHA256\|SHA384\|SHA512]|
- 使用PSS模式时可以指定的参数: - 使用PSS模式时可以指定的参数:
> **说明:** > **说明:**
> >
> 1.[]内的参数只能任选一项,非[]内的为固定值; > 1. []内的参数只能任选一项,非[]内的为固定值;
> 2.使用时请从表格中选择非对称密钥类型、填充模式、摘要、掩码摘要四个数据,用|拼接成字符串。 > 2. 使用时请从表格中选择非对称密钥类型、填充模式、摘要、掩码摘要四个数据,用|拼接成字符串。<br>
> 例如:"RSA2048|PSS|SHA256|MGF1_SHA256" > 例如:"RSA2048|PSS|SHA256|MGF1_SHA256"
| 非对称密钥类型 | 填充模式 | 摘要 | 掩码摘要 | | 非对称密钥类型 | 填充模式 | 摘要 | 掩码摘要 |
|---|---|---|---| |---|---|---|---|
...@@ -362,6 +383,7 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。 ...@@ -362,6 +383,7 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。
|ECC|ECC521| |ECC|ECC521|
### MD消息摘要算法规格 ### MD消息摘要算法规格
- 加解密算法库框架当前支持的MD算法参数: - 加解密算法库框架当前支持的MD算法参数:
|摘要算法|支持种类| |摘要算法|支持种类|
...@@ -374,6 +396,7 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。 ...@@ -374,6 +396,7 @@ RSA签名验签时,涉及两种填充模式:PKCS1和PSS。
|HASH|MD5| |HASH|MD5|
### HMAC消息认证码算法规格 ### HMAC消息认证码算法规格
- 加解密算法库框架当前支持的HMAC算法参数: - 加解密算法库框架当前支持的HMAC算法参数:
|摘要算法|支持种类| |摘要算法|支持种类|
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册