RSA和AES解密和加密问题

Ali*_*lin 5 java android rsa aes

我在我的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();
Run Code Online (Sandbox Code Playgroud)

在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;
      }
Run Code Online (Sandbox Code Playgroud)

在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;   
        }
Run Code Online (Sandbox Code Playgroud)

所以,在我的代码中,我要获得解密的AES密钥

byte[] decryptedAESKey = sm.decryptRSA(key, Base64.decode(ReceivedBase64EncryptedAESKey));
byte[] decryptedString = sm.decryptAES(decryptedAESKey, Base64.decode(ReceivedEncryptedAESString));
Run Code Online (Sandbox Code Playgroud)

最后,我获得了decryptedString的null.我究竟做错了什么 ?

Ali*_*lin 3

嗯,问题是解密的密钥有 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;
      }
Run Code Online (Sandbox Code Playgroud)

以及重写的解密方法:

  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;   
        }
Run Code Online (Sandbox Code Playgroud)