HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密
HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密 RSA指定公钥或私钥字符串加密和解密,得到加密或解密后的字符串
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { util } from '@kit.ArkTS';
@Component
struct Index {
@State message: string = 'Hello World';
@State jmMessage: string = '暂无'
@State jiemMessage: string = '暂无'
@State jieStr: string = ''
private keyPair: cryptoFramework.KeyPair | undefined = undefined
private jmBlob: cryptoFramework.DataBlob = { data: new Uint8Array() }
private privateKey: string = ''
private pubKeyString: string = ''
// 加密
async jm(text: string) {
let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024')
this.keyPair = await rsaGenerator.generateKeyPair()
let Base64Helper = new util.Base64Helper()
let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, this.keyPair.pubKey, null)
let inputUnit8Array = this.convertStringToUnit8Array(this.message)
let inputBlob: cryptoFramework.DataBlob = { data: inputUnit8Array }
let resultBlob = await cipher.doFinal(inputBlob)
this.jmBlob = resultBlob
let resStr = Base64Helper.encodeToStringSync(resultBlob.data)
console.log('jm:' + resultBlob.data.toString())
this.jieStr = resStr
return resStr
}
// 解密
async jiem(text: string) {
try {
let decoder = cryptoFramework.createCipher('RSA1024|PKCS1');
console.log('ji_priKey:' + this.keyPair!.priKey.getEncoded().data.toString())
await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, this.keyPair!.priKey, null);
let Base64Helper = new util.Base64Helper()
let jiemessage = Base64Helper.decodeSync(text)
console.log('jiem:' + jiemessage.toString())
let decryptData = await decoder.doFinal({ data: jiemessage });
let decryptDataString = this.convertUnit8ArrayToString(decryptData.data)
return decryptDataString
} catch (e) {
console.log('error123:' + JSON.stringify(e))
return ''
}
}
// 将base64转成unit8
convertBase64ToUnit8Array(text: string) {
let base64Helper = new util.Base64Helper();
return base64Helper.decodeSync(text)
}
// 将unit8转成string ,字节码不能为0
convertUnit8ArrayToString(uint8: Uint8Array) {
return util.TextDecoder.create().decodeWithStream(uint8)
}
// 将明文string转成unit8,处理不了汉字和特殊字符
convertStringToUnit8Array(text: string) {
let arr: number[] = new Array(text.length)
for (let i = 0, j = text.length; i < j; i++) {
arr[i] = text.charCodeAt(i)
}
return new Uint8Array(arr)
}
build() {
Row() {
Column() {
TextInput({ text: this.message })
.onChange((value: string) => {
this.message = value
})
Text('加密前的数据:')
Text(this.message)
Button('加密').onClick(() => {
this.jm(this.message).then(data => {
this.jmMessage = data
})
})
Button('解密').onClick(() => {
this.jiem(this.jieStr).then(data => {
this.jiemMessage = data
})
})
Text('加密后的数据:')
Text(this.jmMessage)
Text('解密后的数据:')
Text(this.jiemMessage)
}
.width('100%')
}
.height('100%')
}
}
更多关于HarmonyOS鸿蒙Next中RSA指定公钥或私钥字符串加密和解密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,RSA加密和解密可以通过使用cryptoFramework模块来实现。以下是使用指定公钥或私钥字符串进行RSA加密和解密的基本步骤:
-
创建RSA密钥对生成器: 使用
cryptoFramework.createAsyKeyGenerator创建RSA密钥对生成器。let rsaKeyPairGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2"); -
生成RSA密钥对: 调用
rsaKeyPairGenerator.generateKeyPair生成RSA密钥对。rsaKeyPairGenerator.generateKeyPair((err, keyPair) => { if (err) { console.error("Failed to generate key pair: " + err.message); return; } let pubKey = keyPair.pubKey; let priKey = keyPair.priKey; }); -
指定公钥或私钥字符串: 假设你已经有了公钥或私钥的字符串,可以通过
cryptoFramework.createPubKey和cryptoFramework.createPriKey来创建对应的密钥对象。let pubKeyStr = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"; let priKeyStr = "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"; let pubKey = cryptoFramework.createPubKey(pubKeyStr); let priKey = cryptoFramework.createPriKey(priKeyStr); -
加密: 使用
cryptoFramework.createCipher创建RSA加密器,并调用cipher.init和cipher.doFinal进行加密。let cipher = cryptoFramework.createCipher("RSA1024|PKCS1"); cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null); let plainText = "Hello, HarmonyOS!"; cipher.doFinal(plainText, (err, data) => { if (err) { console.error("Failed to encrypt: " + err.message); return; } console.log("Encrypted data: " + data); }); -
解密: 使用
cryptoFramework.createCipher创建RSA解密器,并调用cipher.init和cipher.doFinal进行解密。let cipher = cryptoFramework.createCipher("RSA1024|PKCS1"); cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, priKey, null); let encryptedData = "..."; // 加密后的数据 cipher.doFinal(encryptedData, (err, data) => { if (err) { console.error("Failed to decrypt: " + err.message); return; } console.log("Decrypted data: " + data); });
在HarmonyOS鸿蒙Next中,使用RSA进行加密和解密时,可以通过KeyFactory和X509EncodedKeySpec或PKCS8EncodedKeySpec来加载公钥或私钥的字符串。具体步骤如下:
- 生成RSA密钥对:使用
KeyPairGenerator生成RSA密钥对。 - 加载公钥/私钥:将公钥或私钥字符串转换为
PublicKey或PrivateKey对象。 - 加密:使用
Cipher类,选择RSA/ECB/PKCS1Padding模式进行加密。 - 解密:同样使用
Cipher类进行解密。
示例代码:
// 加载公钥
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.decode(publicKeyStr)));
// 加密
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedData = cipher.doFinal(plainText.getBytes());
// 加载私钥
PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.decode(privateKeyStr)));
// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
确保处理Base64编码和解码,以及异常处理。

