簡體   English   中英

RSA和AES解密和加密問題

[英]RSA and AES Decrypt and Encrypt problem

我在我的Android應用程序上生成了一對RSA密鑰。

我收到一個Web服務 - 一個AES密鑰,用我的RSA公鑰加密 - 一個用AES密鑰編碼的字符串。

所以我必須執行以下操作: - 解密AES密鑰 - 使用獲得的AES密鑰解密字符串。

為了生成RSA密鑰我做了:

 keyGen = KeyPairGenerator.getInstance("RSA");
  keyGen.initialize(size);
  keypair = keyGen.genKeyPair();
  privateKey = keypair.getPrivate();
  publicKey = keypair.getPublic();

在RSA解密我使用:

public static byte[] decryptRSA( PrivateKey key, byte[] text) throws Exception
      { 
          byte[] dectyptedText = null;

          Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
          cipher.init(Cipher.DECRYPT_MODE, key);
          dectyptedText = cipher.doFinal(text);
          return dectyptedText;
      }

在AES解密我使用:

public static byte[] decryptAES(byte[] key, byte[] text) throws Exception {   
            SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");   
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS1Padding");   
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);   
            byte[] decrypted = cipher.doFinal(text);   
            return decrypted;   
        }

所以,在我的代碼中,我要獲得解密的AES密鑰

byte[] decryptedAESKey = sm.decryptRSA(key, Base64.decode(ReceivedBase64EncryptedAESKey));
byte[] decryptedString = sm.decryptAES(decryptedAESKey, Base64.decode(ReceivedEncryptedAESString));

最后,我獲得了decryptedString的null。 我究竟做錯了什么 ?

嗯,問題是解密的密鑰是8字節長,我必須使其16字節與AES 128位兼容

所以,我做了一個方法將其轉換回來

 private static byte[] GetKey(byte[] suggestedKey)
      {
          byte[] kRaw = suggestedKey;
          ArrayList<Byte> kList = new  ArrayList<Byte>();

          for (int i = 0; i < 128; i += 8)
          {
              kList.add(kRaw[(i / 8) % kRaw.length]);
          }

          byte[] byteArray = new byte[kList.size()];
          for(int i = 0; i<kList.size(); i++){
            byteArray[i] = kList.get(i);
          }
          return byteArray;
      }

並重寫的解密方法:

  public static byte[] decryptAES(byte[] key, byte[] text) throws Exception {   

          SecretKeySpec skeySpec = new SecretKeySpec(GetKey(key), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");  

            byte [] iv = new byte[cipher.getBlockSize()];
            for(int i=0;i<iv.length;i++)iv[i] = 0;
            IvParameterSpec ivSpec = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);

            byte[] decrypted = cipher.doFinal(text);   
            return decrypted;   
        }

我不確定你使用的是哪種語言或庫(看起來像Java?),但有些事情要嘗試:

  1. 你有加密的字符串,好嗎? 檢查ReceivedEncryptedAESString的長度和Base64.decode的輸出以檢查它們是否正常。
  2. AES解密不會失敗,因此它必須是庫初始化中的問題。 在構造步驟和初始化步驟之后檢查cipher的值/狀態。
  3. 嘗試更簡單的測試用例:忽略RSA加密,然后嘗試使用Cipher對象解密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM