java - RSA 和 AES 解密和加密问题

标签 java android rsa aes

我已经在我的 android 应用程序上生成了一对 RSA key 。

我从网络服务接收 - 一个 AES key ,用我的 RSA 公钥加密 - 用 AES key 编码的字符串。

因此我必须执行以下操作: - 解密 AES key - 使用获得的 AES key 解密字符串。

要生成我所做的 RSA key :

 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 key ,我这样做了

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

最后我得到一个 null 的 decryptedString。 我究竟做错了什么 ?

最佳答案

好吧,问题是解密的 key 有 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 - RSA 和 AES 解密和加密问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3700039/

相关文章:

java - 如何将 findbugs @Nonnull 与外部库一起使用?

java - 包含具有相同签名的方法的多个接口(interface)

android - Flex Mobile Project 中未显示图例颜色?

java - 不使用 NoPadding 的 RSA 示例

Java SHA1WithRSA 使用 openssl 命令行

c - EVP_PKEY_sign 和 EVP_DigestSignInit 之间的区别?

java - 针对 WAR 运行测试

java - 如何解决 NetBeans 中的 wsimport 错误?

c# - Xamarin "attempt to invoke virtual method ' void android.view.View.unFocus (android.view.View )' on a null object reference"

android - 无法在 JNI 中分离头文件和源文件