加解密
介绍
本示例使用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内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!
鸿蒙【北向应用开发+南向系统层开发】文档
鸿蒙【基础+实战项目】视频
鸿蒙面经
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!