加解密
介绍
本示例使用cryptoFramework接口的Cipher对象相关方法实现了字符串加解密算法,包括RSA加密算法与AES加密算法。
RSA加密算法:RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,由已知加密密钥推导出解密密钥在计算上是不可行的密码体制。
AES加密算法:AES密码学中的高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
效果预览
使用说明
1.点击主页面的加密按钮,在加密界面中点击Encryption Algorithm下拉选择加密算法,在输入框中输入待加密的内容,点击加密 按钮,下方文本框中显示加密后内容。
2.点击重置按钮,清除文本框中内容。
3.点击主页面的解密按钮,在解密界面中点击Decrypt Algorithm下拉选择解密算法,在输入框中输入待解密的内容,点击解密 按钮,下方文本框中显示解密后内容。
4.点击重置按钮,清除文本框中内容。
具体实现
-
本示例分成加密与解密两个模块
-
加密模块
- 使用到rsaEncrypt(RSA算法加密)与aesEncrypt(AES算法加密)两种加密方法进行加密操作。
- 源码:[Encrypt.ets]
-
/** Copyright (c) 2022-2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import { promptAction } from '@kit.ArkUI';
import { CipherModel } from '../model/CipherModel';
import Logger from '../model/Logger';const TAG: string = '[Encrypt]';@Component
export struct Encrypt {@State info: string = '';@State message: string = '';@State algorithmType: string = 'Encrypt Algorithm';private cipherModel: CipherModel = new CipherModel();build() {Stack({ alignContent: Alignment.Center }) {Column() {Select([{ value: 'RSA' },{ value: 'AES' }]).id('encryptAlgorithm').margin(4).selected(0).value(this.algorithmType).font({ size: 20, weight: 300, family: 'serif', style: FontStyle.Normal }).optionFont({ size: 16, weight: 280, family: 'serif', style: FontStyle.Normal }).selectedOptionFont({ size: 16, weight: 280, family: 'serif', style: FontStyle.Normal }).onSelect((index: number, value: string) => {this.algorithmType = value;Logger.info(TAG, `Select: ${index} value: ${value}`);})TextArea().margin(4).width('60%').id('encryptInput').onChange((value: string) => {this.message = value;})Row() {Button($r('app.string.encrypt')).margin(10).fontSize(20).width('30%').height('6%').id('encryptionBtn').onClick(() => {if (this.message === '') {promptAction.showToast({message: 'This message is null.'})} else {if (this.algorithmType === 'RSA') {this.cipherModel.rsaEncrypt(this.message, (result: string) => {Logger.info(TAG, `this result = ${JSON.stringify(result)}`);this.info = `Encryption result is : ${result}`;})} else {this.cipherModel.aesEncrypt(this.message, (result: string) => {Logger.info(TAG, `this result = ${JSON.stringify(result)}`);this.info = `Encryption result is : ${result}`;})}}})Button($r('app.string.reset')).margin(10).fontSize(20).width('30%').height('6%').id('encryptionResetBtn').onClick(() => {this.info = '';})}.margin(10)Text(this.info).id('encryptionInfo').fontSize(18).width('85%').height('25%').border({ width: 2, color: Color.Black }).margin(10).copyOption(CopyOptions.InApp)}}.width('100%').height('100%')}
}
- 源码[CipherModel.ts]
/** Copyright (c) 2022 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import { cryptoFramework } from "@kit.CryptoArchitectureKit";
import { buffer, util } from '@kit.ArkTS';
import Logger from './Logger';
import { BusinessError } from '@kit.BasicServicesKit';const TAG: string = '[CipherModel]'
const AES_ENCRYPT_KEY: string = '5QXzAbJj0TJN9OQNvxFhhw==';
const RSA_ENCRYPT_KEY: string ='MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALXJZEloyLbBB6UbUQzUtM3WGTkcd4dn4HgCxL5wHcdICoLbv6EiUjcaQq8c906hqv6/J7Bv9Owj59XMauKweJUCAwEAAQ==';
const RSA_DECRYPT_KEY: string ='MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAtclkSWjItsEHpRtRDNS0zdYZORx3h2fgeALEvnAdx0gKgtu/oSJSNxpCrxz3TqGq/r8nsG/07CPn1cxq4rB4lQIDAQABAkA3boG2IM2TbKj4H6xHTVUUrwRh9dw83eAEuFNl/qoV6c4zRUAx+efZ29rDz6CVWuAhxaVBDUOmOHvyxOL8m8IBAiEA3EcTP1jngtiJ8lffvIVbehM6p7437+9UScKMXZSy/PkCIQDTRFj00GbAW9oKqEWTrUCWNxNFCSR82Mlw1sZvQh5LfQIgBApBrh3BUUMLdKhr8Bc6EEkeAEma2Qm4sAmjbWv2xHECIF81ux1BWj0wZ9hLs2d1Odk4ot+G2kHFdSr8L9tuIbcFAiEA2rEXmzyQTxZM1N4QDkaLJiCwSfMTYu48DxfUcevbfhA=';
const RSA512_PRIMES_2: string = 'RSA512|PRIMES_2';
const RSA512_PKCS1: string = 'RSA512|PKCS1';
const AES128: string = 'AES128';
const AES128_PKCS7: string = 'AES128|PKCS7';export class CipherModel {stringToUint8Array(str) {return new Uint8Array(buffer.from(str, 'utf-8').buffer);}uint8ArrayToString(array: Uint8Array) {let out: string = '';let index: number = 0;let len: number = array.length;while (index < len) {let character = array[index++];switch (character >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out += String.fromCharCode(character);break;case 12:case 13:out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));break;case 14:out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) |((array[index++] & 0x3F) << 0));break;default:break;}}return out;}rsaEncrypt(message: string, callback) {let rsaGenerator = cryptoFramework.createAsyKeyGenerator(RSA512_PRIMES_2);let cipher = cryptoFramework.createCipher(RSA512_PKCS1);let that = new util.Base64Helper();let pubKey = that.decodeSync(RSA_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };rsaGenerator.convertKey(pubKeyBlob, null, (err, keyPair) => {if (err) {Logger.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null, (err, data) => {let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };cipher.doFinal(input, (err, data) => {Logger.info(TAG, "EncryptOutPut is " + data.data);let result = that.encodeToStringSync(data.data)Logger.info(TAG, "result is " + result);callback(result)})})})}rsaDecrypt(message: string, callback) {let rsaGenerator = cryptoFramework.createAsyKeyGenerator(RSA512_PRIMES_2);let cipher = cryptoFramework.createCipher(RSA512_PKCS1);let that = new util.Base64Helper();let priKey = that.decodeSync(RSA_DECRYPT_KEY);let priKeyBlob: cryptoFramework.DataBlob = { data: priKey };rsaGenerator.convertKey(null, priKeyBlob, (err, keyPair) => {if (err) {Logger.error(TAG, "convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null, (err, data) => {try {let newMessage = that.decodeSync(message);let input: cryptoFramework.DataBlob = { data: newMessage };cipher.doFinal(input, (err, data) => {if (err) {Logger.error(TAG, "cipher doFinal." + (err as BusinessError).code);return;}Logger.info(TAG, "DecryptOutPut is " + data.data);let result = this.uint8ArrayToString(data.data);Logger.info(TAG, "result is " + result);callback(result)})} catch (err) {Logger.info(TAG, "cipher init error: " + (err as BusinessError).code);return err;}})})}aesEncrypt(message: string, callback) {let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);let cipher = cryptoFramework.createCipher(AES128_PKCS7);let that = new util.Base64Helper();let pubKey = that.decodeSync(AES_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {if (err) {console.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, data) => {let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };cipher.doFinal(input, (err, data) => {Logger.info(TAG, "EncryptOutPut is " + data.data);let result = that.encodeToStringSync(data.data)Logger.info(TAG, "result is " + result);callback(result)})})})}aesDecrypt(message: string, callback) {let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);let cipher = cryptoFramework.createCipher(AES128_PKCS7);let that = new util.Base64Helper();let pubKey = that.decodeSync(AES_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {if (err) {console.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null, (err, data) => {try {let newMessage = that.decodeSync(message);let input: cryptoFramework.DataBlob = { data: newMessage };cipher.doFinal(input, (err, data) => {if (err) {Logger.error(TAG, "cipher doFinal." + (err as BusinessError).code);return;}Logger.info(TAG, "DecryptOutPut is " + data?.data);let result = this.uint8ArrayToString(data?.data)Logger.info(TAG, "result is " + result);callback(result)})} catch (err) {Logger.info(TAG, "cipher init error: " + (err as BusinessError).code);return err;}})})}
}
-
接口参考:@ohos.security.cryptoFramework,@ohos.promptAction,@ohos.router
-
解密模块
-
使用到rsaDecrypt(RSA算法解密)与aesDecrypt(AES算法解密)两种解密方法进行解密操作。
-
源码:[Decrypt.ets]
/** Copyright (c) 2022-2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import { promptAction } from '@kit.ArkUI';
import { CipherModel } from '../model/CipherModel';
import Logger from '../model/Logger';const TAG: string = '[Decrypt]';@Component
export struct Decrypt {@State info: string = '';@State message: string = '';@State algorithmType: string = 'Decrypt Algorithm';private cipherModel: CipherModel = new CipherModel();build() {Stack({ alignContent: Alignment.Center }) {Column() {Select([{ value: 'RSA' },{ value: 'AES' }]).id('decryptAlgorithm').margin(4).selected(0).value(this.algorithmType).font({ size: 20, weight: 300, family: 'serif', style: FontStyle.Normal }).selectedOptionFont({ size: 16, weight: 280, family: 'serif', style: FontStyle.Normal }).optionFont({ size: 16, weight: 280, family: 'serif', style: FontStyle.Normal }).onSelect((index: number, value: string) => {this.algorithmType = value;Logger.info(TAG, `Select: ${index} value: ${value}`);})TextArea().id('decryptInput').margin(6).width('60%').onChange((value: string) => {this.message = value;})Row() {Button($r('app.string.decrypt')).fontSize(20).margin(10).width('30%').height('6%').id('decryptBtn').onClick(() => {if (this.message === '') {promptAction.showToast({message: 'This message is null.'})} else {if (this.algorithmType === 'RSA') {this.cipherModel.rsaDecrypt(this.message, (result: string) => {Logger.info(TAG, `this result = ${JSON.stringify(result)}`);this.info = `Decrypt result is : ${result}`;})} else {this.cipherModel.aesDecrypt(this.message, (result: string) => {Logger.info(TAG, `this result = ${JSON.stringify(result)}`);this.info = `Decrypt result is : ${result}`;})}}})Button($r('app.string.reset')).fontSize(20).margin(10).width('30%').height('6%').id('decryptResetBtn').onClick(() => {this.info = '';})}.margin(10)Text(this.info).id('decryptInfo').fontSize(18).width('85%').height('25%').border({ width: 2, color: Color.Black }).margin(10)}}.width('100%').height('100%')}
}
源码[CipherModel.ts]
/** Copyright (c) 2022 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/import { cryptoFramework } from "@kit.CryptoArchitectureKit";
import { buffer, util } from '@kit.ArkTS';
import Logger from './Logger';
import { BusinessError } from '@kit.BasicServicesKit';const TAG: string = '[CipherModel]'
const AES_ENCRYPT_KEY: string = '5QXzAbJj0TJN9OQNvxFhhw==';
const RSA_ENCRYPT_KEY: string ='MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALXJZEloyLbBB6UbUQzUtM3WGTkcd4dn4HgCxL5wHcdICoLbv6EiUjcaQq8c906hqv6/J7Bv9Owj59XMauKweJUCAwEAAQ==';
const RSA_DECRYPT_KEY: string ='MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAtclkSWjItsEHpRtRDNS0zdYZORx3h2fgeALEvnAdx0gKgtu/oSJSNxpCrxz3TqGq/r8nsG/07CPn1cxq4rB4lQIDAQABAkA3boG2IM2TbKj4H6xHTVUUrwRh9dw83eAEuFNl/qoV6c4zRUAx+efZ29rDz6CVWuAhxaVBDUOmOHvyxOL8m8IBAiEA3EcTP1jngtiJ8lffvIVbehM6p7437+9UScKMXZSy/PkCIQDTRFj00GbAW9oKqEWTrUCWNxNFCSR82Mlw1sZvQh5LfQIgBApBrh3BUUMLdKhr8Bc6EEkeAEma2Qm4sAmjbWv2xHECIF81ux1BWj0wZ9hLs2d1Odk4ot+G2kHFdSr8L9tuIbcFAiEA2rEXmzyQTxZM1N4QDkaLJiCwSfMTYu48DxfUcevbfhA=';
const RSA512_PRIMES_2: string = 'RSA512|PRIMES_2';
const RSA512_PKCS1: string = 'RSA512|PKCS1';
const AES128: string = 'AES128';
const AES128_PKCS7: string = 'AES128|PKCS7';export class CipherModel {stringToUint8Array(str) {return new Uint8Array(buffer.from(str, 'utf-8').buffer);}uint8ArrayToString(array: Uint8Array) {let out: string = '';let index: number = 0;let len: number = array.length;while (index < len) {let character = array[index++];switch (character >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out += String.fromCharCode(character);break;case 12:case 13:out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));break;case 14:out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) |((array[index++] & 0x3F) << 0));break;default:break;}}return out;}rsaEncrypt(message: string, callback) {let rsaGenerator = cryptoFramework.createAsyKeyGenerator(RSA512_PRIMES_2);let cipher = cryptoFramework.createCipher(RSA512_PKCS1);let that = new util.Base64Helper();let pubKey = that.decodeSync(RSA_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };rsaGenerator.convertKey(pubKeyBlob, null, (err, keyPair) => {if (err) {Logger.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null, (err, data) => {let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };cipher.doFinal(input, (err, data) => {Logger.info(TAG, "EncryptOutPut is " + data.data);let result = that.encodeToStringSync(data.data)Logger.info(TAG, "result is " + result);callback(result)})})})}rsaDecrypt(message: string, callback) {let rsaGenerator = cryptoFramework.createAsyKeyGenerator(RSA512_PRIMES_2);let cipher = cryptoFramework.createCipher(RSA512_PKCS1);let that = new util.Base64Helper();let priKey = that.decodeSync(RSA_DECRYPT_KEY);let priKeyBlob: cryptoFramework.DataBlob = { data: priKey };rsaGenerator.convertKey(null, priKeyBlob, (err, keyPair) => {if (err) {Logger.error(TAG, "convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair.priKey, null, (err, data) => {try {let newMessage = that.decodeSync(message);let input: cryptoFramework.DataBlob = { data: newMessage };cipher.doFinal(input, (err, data) => {if (err) {Logger.error(TAG, "cipher doFinal." + (err as BusinessError).code);return;}Logger.info(TAG, "DecryptOutPut is " + data.data);let result = this.uint8ArrayToString(data.data);Logger.info(TAG, "result is " + result);callback(result)})} catch (err) {Logger.info(TAG, "cipher init error: " + (err as BusinessError).code);return err;}})})}aesEncrypt(message: string, callback) {let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);let cipher = cryptoFramework.createCipher(AES128_PKCS7);let that = new util.Base64Helper();let pubKey = that.decodeSync(AES_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {if (err) {console.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, data) => {let input: cryptoFramework.DataBlob = { data: this.stringToUint8Array(message) };cipher.doFinal(input, (err, data) => {Logger.info(TAG, "EncryptOutPut is " + data.data);let result = that.encodeToStringSync(data.data)Logger.info(TAG, "result is " + result);callback(result)})})})}aesDecrypt(message: string, callback) {let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);let cipher = cryptoFramework.createCipher(AES128_PKCS7);let that = new util.Base64Helper();let pubKey = that.decodeSync(AES_ENCRYPT_KEY);let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };aesGenerator.convertKey(pubKeyBlob, (err, symKey) => {if (err) {console.error("convertKey: error." + (err as BusinessError).code);return;}cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null, (err, data) => {try {let newMessage = that.decodeSync(message);let input: cryptoFramework.DataBlob = { data: newMessage };cipher.doFinal(input, (err, data) => {if (err) {Logger.error(TAG, "cipher doFinal." + (err as BusinessError).code);return;}Logger.info(TAG, "DecryptOutPut is " + data?.data);let result = this.uint8ArrayToString(data?.data)Logger.info(TAG, "result is " + result);callback(result)})} catch (err) {Logger.info(TAG, "cipher init error: " + (err as BusinessError).code);return err;}})})}
}
- 接口参考:@ohos.security.cryptoFramework,@ohos.promptAction,@ohos.router
以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下:
内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!
鸿蒙【北向应用开发+南向系统层开发】文档
鸿蒙【基础+实战项目】视频
鸿蒙面经
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!