HarmonyOS app登录密码需要生成RSA/ECB/OAEPwithSHA-256andMGF1Padding加密方式的base64字符串

目前有c/oc加密部分源代码,看是否能通过源码提供对应HarmonyOS加密版本。如果不行希望能通过里面c语言部分编译成HarmonyOS可以调用的库。目前加密部分涉及登录密码加密、所有重要功能包括远控pin校验加密,项目目前卡住了。

HarmonyOS
2024-12-25 16:15:52
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

以下为 RSA1024|PKCS1_OAEP|SHA256|MGF1_SHA256 模式加解密

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util } from '@kit.ArkTS';

@Entry
@Component
struct RSAOAEPCrypto {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            RSAOAEP()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

function stringToPEMKey(string:string,PEMString:string){
  let strLen = string.length
  let numLoop =  Math.ceil((strLen+1)/64)
  console.error("strLen: " + strLen)
  console.error("numLoop: " + numLoop)
  let a = 0;
  let StringKey = PEMString;
  for (let i = 1; i <= numLoop; i++) {
    let String = string.slice(a,i*64-1)
    a = i*64
    StringKey = StringKey + String + `\n`;
  }
  return StringKey;
}
// 生成RSA密钥对
async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
  console.error('convertKey success');
  return keyPair;
}
// 加密消息
function encryptMessage(symKey: cryptoFramework.PubKey, plainText: cryptoFramework.DataBlob) {
  let cipher = cryptoFramework.createCipher('RSA1024|PKCS1_OAEP|SHA256|MGF1_SHA256');
  cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
  let cipherData = cipher.doFinalSync(plainText);
  return cipherData;
}
// 解密消息
function decryptMessage(symKey: cryptoFramework.PriKey, plainText: cryptoFramework.DataBlob) {
  let decoder = cryptoFramework.createCipher('RSA1024|PKCS1_OAEP|SHA256|MGF1_SHA256');
  decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null);
  let cipherData = decoder.doFinalSync(plainText);
  return cipherData;
}

async function RSAOAEP() {

  let pkData = "-----BEGIN PUBLIC KEY-----\n" +
    "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr+q/H5DxV1etGxTNWtns\n" +
    "xmVkiAKVPEcejoNT2xObwsQ/WTq7RtOAUOkIY3Yd63S3RFcdmlIy4NFEg+ccrqpu\n" +
    "4z/Zi0AHELDk28WxMxLj1tr7oz/f0DbyjpzyRW/6Cm9RMfGtASiJFmARlQiVaZ+f\n" +
    "/QemObAJfnJLEbqOJeIh6byJ/dUCWTIVqaK/2n+1hBsfcFq8OAAXG3fMOVipOSNc\n" +
    "raL6FxPrZ2iVS6OvbTV2PmiF8PU4KSIPVNj1Nfe3Gc2W7q/NRkMFWfhOg5zO7YRd\n" +
    "eR4t8ZlOdURpKyIwRKiBDXx9jUedagswu7RqWC2/9XB1exP9N8A4PMCTLnweljEc\n" +
    "ewIDAQAB\n" +
    "-----END PUBLIC KEY-----"

  let skData = "-----BEGIN PRIVATE KEY-----\n" +
    "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCv6r8fkPFXV60b\n" +
    "FM1a2ezGZWSIApU8Rx6Og1PbE5vCxD9ZOrtG04BQ6Qhjdh3rdLdEVx2aUjLg0USD\n" +
    "5xyuqm7jP9mLQAcQsOTbxbEzEuPW2vujP9/QNvKOnPJFb/oKb1Ex8a0BKIkWYBGV\n" +
    "CJVpn5/9B6Y5sAl+cksRuo4l4iHpvIn91QJZMhWpor/af7WEGx9wWrw4ABcbd8w5\n" +
    "WKk5I1ytovoXE+tnaJVLo69tNXY+aIXw9TgpIg9U2PU197cZzZbur81GQwVZ+E6D\n" +
    "nM7thF15Hi3xmU51RGkrIjBEqIENfH2NR51qCzC7tGpYLb/1cHV7E/03wDg8wJMu\n" +
    "fB6WMRx7AgMBAAECggEAdB90TCUEetBgb3j62ZbzKj9x7iouUtzrec2NBBdcgWPE\n" +
    "IWWYi/c/Q6mgJO+qbmvcMhuDagQKm8boAF4F2/KbQh06wCXixAzQ9ZX5E6rLhV+G\n" +
    "LkwStMIguS0268kv98Vlhp9uwU39uCxwTr2cy11YYdGz0261xacykKBiBvXPxxba\n" +
    "QQe1WMR4sHpOHKEUN3iW/7iPffUdcqYiTiHvc605PA3rReoG10D8klVtxZAQMlxI\n" +
    "eiqUpneAxqsw97x+uYyWSXGGC57/pRN4ZygbrM6FIG6HBYC/zlIPWHWxc7ym45OA\n" +
    "jsI0QxPky5KzKU/VtMdKdky9AfANgQ9dpIrw6GvB+QKBgQDfdzgSDMj6mOqhE8ZC\n" +
    "/D4on14SPvyX0e29ZzSbdE/khABeg9oOK2sQpunO8K8ZSLo3YhdzVkJkF3RLwzAu\n" +
    "VExg4seeZhQLsiw9NmwdosIqZvRBOFjAOvzw+a/Uo2lOpML9sFqw9ywxegDS9Xxq\n" +
    "Iq0x3pfoiq4YaIbPXZYQKvg5tQKBgQDJh1dT+6kVcyh0tKgsxu2GTcL0XYaiU5uI\n" +
    "YkkWoTdOI+x/nBIusypPK599ZZJS7s1Ev//g+SvbLtYP/QpserXxjOrCoXN5thNX\n" +
    "hYjGzYqp2siE0Rz4rawuv0LUGmcPVBBl78M0Yw70Lp7Pd1zhLCpYxN1w041qDu9D\n" +
    "s38osNIbbwKBgB6Xp6lw7qLABH8AwgexmKDfEHXXAaWXK8DePCl8BuP13kcSLev6\n" +
    "rbGd6CxYbuA7QKMMXsF/cZ9aRqWIlzQAfmRVJ5bbyqq/PaczqCF2grZjWdUD7cKD\n" +
    "UNV8mUG3DVei3r70QbYwYHB1j19SFDJDhQpquskvEx5sUOham4yjFVBxAoGAPems\n" +
    "dIquKX7VgPU3bXo34rjlGfnZsOkKsV2wopkoyoLS12l1VI+KggQe3YFk8MGYonRy\n" +
    "AgXK6W18KjFNEIKqfukR/nVnao77ZjoKCTmATip+y/8KbYO9kCcGOu9ZliX3W7nL\n" +
    "OL7uCyp/c7FyAWN2JwtkFJOJsHmiHCR6/l9ETVUCgYBqH8eXUsGuu6HmzFgkgKZ/\n" +
    "w+nnFQNoNUgWQyD7ahxSgI6yijS9dfedD1GiYh2xYn7MjKBpKaikLBuSA/8V2+tp\n" +
    "+t20QNGzTEBtz1+u4QoHNMliP3+qZL4nsraypYCurgL0twMZxmLq1d5pR2yL74CQ\n" +
    "nuLkoZ5CforupRMjEaxPDw==\n" +
    "-----END PRIVATE KEY-----";

  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
  let keyPairData = asyKeyGenerator.convertPemKeySync(pkData, skData);

  if (keyPairData != null) {
    console.error('[Sync]: convert pem key pair success');
  } else {
    console.error("[Sync]: convert pem key pair result fail!");
  }

  let priPemKey = keyPairData.priKey;
  let pubPemKey = keyPairData.pubKey;
  // pem生成公私密钥字符串
  let priString = priPemKey.getEncodedPem('PKCS8');
  let pubString = pubPemKey.getEncodedPem('X509');
  // 去除字符串 -----BEGIN PRIVATE KEY-----
  let priB = priString.replace("-----BEGIN PRIVATE KEY-----", "")
  let pubB = pubString.replace("-----BEGIN PUBLIC KEY-----", "")
  // 去除字符串 -----END PRIVATE KEY-----
  let priE = priB.replace("-----END PRIVATE KEY-----", "")
  let pubE = pubB.replace("-----END PUBLIC KEY-----", "")
  // 去除换行符
  let pri = priE.replaceAll("\n", "")
  let pub = pubE.replaceAll("\n", "")

  console.info("[Sync]TestPkcs1ToPkcs8BySync pripripri output is " + pri);
  console.info("[Sync]TestPkcs1ToPkcs8BySync pubpubpub output is " + pub);

  // base64 转换器
  let base64 = new util.Base64Helper();
  // base64 转码
  let base64pkData = base64.decodeSync(pub) ;
  let base64skData = base64.decodeSync(pri) /*new Uint8Array()*/;

  let keyPair = await genKeyPairByData(base64pkData, base64skData);

  //明文
  let plan = "This is a test";
  let input: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(plan, 'utf-8').buffer) };
  let cipherDataBlob = encryptMessage(keyPair.pubKey, input)
  console.error('encrypt plainText base64: ' + base64.encodeToStringSync(cipherDataBlob.data));

  let decodeData = decryptMessage(keyPair.priKey, cipherDataBlob/*{ data: new Uint8Array(message)}*/)
  let textDecoder = util.TextDecoder.create('utf-8')
  let string = textDecoder.decodeWithStream(decodeData.data)
  console.error("string : " + string)
  // Uint8Array 转 Base64 String
  let base64String = base64.encodeToStringSync(decodeData.data);
  console.error("decodeData base64 string:   " + base64String);

  /*if (decodeData.data.toString() === input.data.toString()) {
    // Uint8Array 转 String字符串
    let textDecoder = util.TextDecoder.create('utf-8')
    let string = textDecoder.decodeWithStream(decodeData.data)
    console.error("oaep decrypt success:   " + string);
  } else {
    console.error("oaep decrypt fail");
  }*/

}
分享
微博
QQ
微信
回复
2024-12-25 18:19:17
相关问题
HarmonyOS 图片转为base64字符
400浏览 • 1回复 待解决
base64字符如何转为图片并保存
2996浏览 • 1回复 待解决
PixelMap类型怎么转换成Base64字符
944浏览 • 1回复 待解决
如何将PixelMap转图片base64字符
851浏览 • 1回复 待解决
如何将图片base64字符转PixelMap?
966浏览 • 1回复 待解决
base64字符保存为图片方法
1344浏览 • 1回复 待解决
HarmonyOS SM2加签返回Base64字符
289浏览 • 1回复 待解决
HarmonyOS RSA加密base64秘钥转换
334浏览 • 1回复 待解决