HarmonyOS中RSA如何用公钥解密?

HarmonyOS中RSA如何用公钥解密?RSA使用私钥加密后,如何用公钥解密

阅读 563
avatarAI BotBETA

在RSA加密体系中,通常的做法是使用公钥进行加密,然后使用对应的私钥进行解密。您提到的“RSA使用私钥加密后,如何用公钥解密”实际上违背了RSA加密设计的基本原则。在标准的RSA操作中,公钥用于加密数据,私钥用于解密数据。

然而,如果确实需要实现一种机制,使得数据可以通过某种方式被公钥“解密”(这通常不是RSA的直接用途),那么可能是在谈论数字签名验证的过程,其中私钥用于签名数据,公钥用于验证签名的有效性。但这并不是传统意义上的“解密”。

RSA 加密和解密

对于标准的RSA加密和解密操作,以下是流程:

  1. 加密:使用接收者的公钥加密数据。
  2. 解密:使用接收者的私钥解密数据。

如果确实需要类似“公钥解密”的功能

如果你的场景确实需要一种机制,使得看似被“公钥解密”,实际上你可能是在寻找一种方式来验证数据。在RSA中,这通常是通过数字签名来实现的:

  1. 签名:发送者使用自己的私钥对数据进行签名。
  2. 验证:接收者使用发送者的公钥来验证签名的有效性。这个验证过程可以理解为一种“公钥解密”的类比,但实际上它是在验证数据的完整性和来源。

示例(非加密解密,而是签名验证)

// 假设你已经有了一个RSA密钥对
PrivateKey privateKey = ...;
PublicKey publicKey = ...;

// 签名数据
Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(privateKey);
signer.update("The message to sign".getBytes());
byte[] signature = signer.sign();

// 验证签名
Signature verifier = Signature.getInstance("SHA256withRSA");
verifier.initVerify(publicKey);
verifier.update("The message to sign".getBytes());
boolean isValid = verifier.verify(signature);

// isValid 会是 true 如果签名有效

结论

在HarmonyOS或任何其他平台上,RSA加密和解密的标准做法是:使用公钥加密,私钥解密。如果你需要类似“公钥解密”的功能,你可能是在寻找数字签名的验证过程。

2 个回答

具体参考示例如下:

//私钥加密 
async function signMessagePromise(priKey: cryptoFramework.PriKey) { 
  let signAlg = "RSA1024||PKCS1|SHA256|MGF1_SHA256|NoHash|OnlySign"; 
  let signer = cryptoFramework.createSign(signAlg); 
  await signer.init(priKey); 
  let signData = await signer.sign({data:stringToUint8Array("私钥加密")}); 
  return signData; 
} 
// 公钥解密 
async function verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) { 
  let verifyAlg = "RSA1024|PKCS1|SHA256|MGF1_SHA256|NoHash|Recover"; 
  let verifier = cryptoFramework.createVerify(verifyAlg); 
  await verifier.init(pubKey); 
  let rawSignData = await verifier.recover(signMessageBlob); 
  console.log("rsa puk data " + uint8ArrayToString(rawSignData?.data)) 
  return rawSignData; 
} 
 
// 字符串转成字节流 
export function stringToUint8Array(str: string) { 
  return new Uint8Array(buffer.from(str,'utf-8').buffer); 
} 
 
// 字节流转成可理解的字符串 
export function uint8ArrayToString(array:Uint8Array) { 
  // 将UTF-8编码转换成Unicode编码 
  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; 
}

参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

  rsaKeyBase64(puk: string, prk: string) {
    // 创建一个AsyKeyGenerator实例
    const base = new util.Base64Helper();
    let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA2048');
    if (puk != '' && prk != '') {
      let keyPair = rsaGenerator.convertKeySync({ data: base.decodeSync(puk) }, { data: base.decodeSync(prk) });
      return keyPair;
    } else if (prk != '') {
      let keyPair = rsaGenerator.convertKeySync(null, { data: base.decodeSync(prk) });
      return keyPair;
    } else if (puk != '') {
      let keyPair = rsaGenerator.convertKeySync({ data: base.decodeSync(puk) }, null);
      return keyPair;
    } else {
      let keyPair = rsaGenerator.generateKeyPairSync();
      return keyPair;
    }
  }

  uint8ArrayToString(array:Uint8Array) {
    // 将UTF-8编码转换成Unicode编码
    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;
  }

  // 字符串转成字节流
  stringToUint8Array(str: string) {
    return new Uint8Array(buffer.from(str,'utf-8').buffer);
  }


  // 公钥解密
  async verifyMessagePromise(signMessageBlob: cryptoFramework.DataBlob, pubKey: cryptoFramework.PubKey) {
    let verifyAlg = "RSA1024|PKCS1|NoHash|Recover";
    let verifier = cryptoFramework.createVerify(verifyAlg);
    await verifier.init(pubKey);
    let rawSignData = await verifier.recover(signMessageBlob);
    console.log("rsa puk data " + this.uint8ArrayToString(rawSignData?.data))
    return rawSignData;
  }

/// 测试调用
  async main(planText: Uint8Array) {
    try {
      let length = 128;
      let updateLength = Math.ceil(planText.length / length);
      let planData = new Uint8Array()
/// 公钥,自己修改
      let key =
        'ABCABC'
      let keyPair = this.rsaKeyBase64(key, '')
      for (let i = 0; i < updateLength; i++) {
        let text = planText.slice(i * length, (i + 1) * length);
        let signData = await this.verifyMessagePromise({ data: text }, keyPair.pubKey)
        if (signData) {
          let mergeText = new Uint8Array(planData.length + signData.data.length);
          mergeText.set(planData);
          mergeText.set(signData.data, planData.length);
          planData = mergeText;
        }
      }
      let content = this.uint8ArrayToString(planData)
      console.log(content)
    } catch (error) {
      console.error(`catch error, ${error.code}, ${error.message}`);
    }
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进