HarmonyOS鸿蒙Next中如何把以上Android解密方法转成代码

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

HarmonyOS鸿蒙Next中如何把以上Android解密方法转成代码

private static final String KEY_ALGORITHM = “RSA”;

private static final String CIPHER_ALGORITHM = “RSA/None/PKCS1Padding”;

private static final int MAX_ENCRYPT_BLOCK = 53; // for 512-bit key

private static final int MAX_DECRYPT_BLOCK = 64; // for 512-bit key

private static final int KEY_SIZE = 512;

public static String decryptFromBase64(String encryptedBase64, String privateKey) throws Exception { byte[] encryptedBytes = Base64.decode(encryptedBase64, Base64.DEFAULT); byte[] decryptedBytes = decryptByPrivateKey(encryptedBytes, privateKey); return new String(decryptedBytes, “UTF-8”); }

public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception { byte[] keyBytes = Base64.decode(privateKey, Base64.DEFAULT); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateK); return processData(encryptedData, cipher, MAX_DECRYPT_BLOCK); }

private static byte[] processData(byte[] data, Cipher cipher, int blockSize) throws Exception { int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; while (inputLen - offSet > 0) { if (inputLen - offSet > blockSize) { cache = cipher.doFinal(data, offSet, blockSize); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * blockSize; } byte[] output = out.toByteArray(); out.close(); return output; }

public static String desEncrypt(String data, String key, String iv) throws Exception { try { byte[] encrypted1 = Base64.decode(data, Base64.DEFAULT); Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), “AES”); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { e.printStackTrace(); return null; } }

如何把以上android 解密方法转成鸿蒙代码


更多关于HarmonyOS鸿蒙Next中如何把以上Android解密方法转成代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

rsa 私钥加密 公钥解密的关键代码

// 字符串转成字节流
export function stringToUint8Array(str: string) {
  return new Uint8Array(buffer.from(str,'utf-8').buffer);
}
// Uint8Array转成String
function uint8ArrayToString(input: Uint8Array): string {
  let textDecoder = util.TextDecoder.create('utf-8');
  return textDecoder.decodeWithStream(input);
}
// 公钥解密
function verifyMessage(pubKey: cryptoFramework.PubKey,signMessageBlob: cryptoFramework.DataBlob) {
  let verifyAlg = "RSA2048|PKCS1|NoHash|Recover";
  let verifier = cryptoFramework.createVerify(verifyAlg);
  verifier.initSync(pubKey);
  let rawSignData = verifier.recoverSync(signMessageBlob);
  console.log("rsa puk data " + uint8ArrayToString(rawSignData?.data))
  return rawSignData;
}
//私钥加密
function signMessage(priKey: cryptoFramework.PriKey, plainText:cryptoFramework.DataBlob) {
  let signAlg = "RSA2048|PKCS1|NoHash|OnlySign";
  let signer = cryptoFramework.createSign(signAlg);
  signer.initSync(priKey);
  let signData = signer.signSync({data:stringToUint8Array("私钥加密")});
  return signData;
}
// 密钥转换
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 = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
  console.info('convertKey success');
  return keyPair;
}
//Rsa 加解密
function RsaReverse() {
  let pkData = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjSASCSzDPoXFq/6V5kXhhdH+gLaalmhZ+FNJZCx8Rr94po93Y85Icwwo2jQvnx8tRX0mof0Sk1GqgqSUHniXOJewu6KHDt8wZTnY8ncB3HJmPUa8Pct01MOmRZI3a31Rh6P8mZPI1iwZD/lxGkkyVo2MQDp/M4AwIy7n+QkGkfQIDAQAB";
  let skData = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKNIBIJLMM+hcWr/pXmReGF0f6AtpqWaFn4U0lkLHxGv3imj3djzkhzDCjaNC+fHy1FfSah/RKTUaqCpJQeeJc4l7C7oocO3zBlOdjydwHccmY9Rlw9y3TUw6ZFkjdrfVGHo/yZk8jWLBkP+XEaSTJWjYxAOn8zgDAjLuf5CQaR9AgMBAAECgYABLlIqBxUxSz+gwHyX5n9yZP9PT0U3SWgEPW5QCo6M+DKpJnBCU3CpGJgIUPjXElDcI85Kk7ERaB/lTZPg/DnVwuaDoWO3utNkA9J5y1xIrJ+m32Op1WPQjYNTq8CDyVO0wqOsgXVMsbJaEezlNZed2gQ5CQQKLiIDuMznzla+gQJBANZHZMh+WX7RMBdeIHmWLRhg/nc9KVWYjSkD/d4S6HTBKASLdEDmSLT4NpVbEXtlpmaqV9wEaEY+QBjdkfMHaI0CQQDDEq4X2VvjCqjUiKeSTNXywxl48LLHC3A5pkl9vRYlt+ec7SLydseShP834DCBZIjRvqHs5UdXzvFOEQYaAIexAkBPc3FfFdpBN3dJctE/w/s8itpPhBILduEAUEaVTRV8FRKtfLfCSKC02UQD5Rx6UJp+frLNFaVERlil36H6JskRAkEAkVE4GZIVTmQhcvo+AtF0S/0k26BLPdX6iyeh9aZHel+ujYtmDkOH1lF3InPDDpELD1y4mZYPeI0z21j5N6OPcQJAdxnnEtw05TaX2DxbVhxPvEcwgpU/CpsrIC1eNe17Th68jAX4xVxTxSAUftECw8rBQ5C9vxGPbuPyvfk6MKkZ8A==";
  let base64 = new util.Base64Helper();
  let pubKeyBlob = base64.decodeSync(pkData)
  let priKeyBlob = base64.decodeSync(skData);

  let keyPair = genKeyPairByData(pubKeyBlob, priKeyBlob);

  let pubKey = keyPair.pubKey
  let priKey = keyPair.priKey

  let message = "This is a test";
  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
  let encryptText = signMessage(priKey, plainText);
  let decryptText = verifyMessage(pubKey, encryptText);
}

更多关于HarmonyOS鸿蒙Next中如何把以上Android解密方法转成代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,若要将Android的解密方法转换为代码,首先需要明确Android所使用的加密算法和密钥管理方式。HarmonyOS提供了自己的安全框架和API,可以直接使用这些API来实现相同的解密逻辑。

假设Android使用的是AES加密算法,以下是一个简单的示例,展示如何在HarmonyOS中实现AES解密:

import cryptoFramework from '@ohos.security.cryptoFramework';

async function aesDecrypt(cipherText: Uint8Array, key: Uint8Array, iv: Uint8Array): Promise<Uint8Array> {
    // 创建对称密钥生成器
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
    // 导入密钥
    let symKey = await symKeyGenerator.convertKey(key);
    
    // 创建解密器
    let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');
    await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, { iv: iv });
    
    // 执行解密
    let plainText = await cipher.doFinal(cipherText);
    
    return plainText;
}

在这个示例中,cipherText是待解密的密文,key是解密密钥,iv是初始化向量。cryptoFramework是HarmonyOS提供的加密框架,createSymKeyGenerator用于创建对称密钥生成器,createCipher用于创建解密器。

需要注意的是,HarmonyOS的API和Android的API有所不同,因此在转换代码时需要根据HarmonyOS的文档进行调整。此外,密钥管理和安全策略也需要根据HarmonyOS的要求进行适配。

在HarmonyOS鸿蒙Next中,可以通过使用ohos.security.crypto模块来实现类似于Android的加密解密功能。以下是一个示例代码,展示如何实现AES解密:

import ohos.security.crypto.Cipher;
import ohos.security.crypto.CipherParameters;
import ohos.security.crypto.KeyParameter;

public class AESDecryptor {
    public static byte[] decrypt(byte[] encryptedData, byte[] key) {
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            CipherParameters params = new KeyParameter(key);
            cipher.init(Cipher.DECRYPT_MODE, params);
            return cipher.doFinal(encryptedData);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

这段代码展示了如何使用HarmonyOS的Cipher类进行AES解密。你需要提供加密数据和密钥作为输入,解密后的数据将作为输出返回。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!