Java RSA和AES的解密和加密问题

Java RSA和AES的解密和加密问题,java,android,rsa,aes,Java,Android,Rsa,Aes,我在android应用程序上生成了一对RSA密钥 我从web服务接收 -AES密钥,使用我的RSA公钥加密 -用AES密钥编码的字符串 因此,我必须做到以下几点: -解密AES密钥 -使用获得的AES密钥解密字符串 要生成RSA密钥,我执行了以下操作: keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(size); keypair = keyGen.genKeyPair(); privateKey = k

我在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。
我做错了什么

我不确定您使用的是什么语言或库(看起来像Java?),但需要尝试一些非常通用的东西:

  • 你拿到加密字符串了吗?检查
    receivedencryptedesstring
    的长度和
    Base64的输出。解码
    以检查它们是否正常
  • AES解密不能失败,所以它一定是库初始化中的一个问题。在构造步骤和初始化步骤之后,检查
    密码的值/状态
  • 尝试一个更简单的测试用例:忽略RSA加密,只是尝试使用您的Cipher对象解密某些内容

  • 嗯,问题是解密的密钥是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;
          }
    
    私有静态字节[]GetKey(字节[]suggestedKey)
    {
    字节[]kRaw=建议的密钥;
    ArrayList kList=新的ArrayList();
    对于(int i=0;i<128;i+=8)
    {
    K列表添加(克拉[(i/8)%克拉长度]);
    }
    byte[]byteArray=新字节[kList.size()];
    
    例如(inti=0;我正在使用Android及其附带的库。1.看起来不错,例如,我得到了ReceivedEncryptedAESString=qjYcPCHkFpbTjntDCpXCGabSY5DFH…解密的密钥看起来像:[121,98,51,100,108,112,118,107,118,97]2.问题似乎出在cipher.init(cipher.DECRYPT_模式,skeySpec);当它抛出异常时:InvalidKeyException:密钥长度不是128/192/256位。可能我的RSA解密错误?密钥数组有多长?可能它太短(小于128位)需要某种填充,或者太长,需要截断。AES仅在这三个密钥长度上定义。由于这是从web服务检索到的字符串,您需要找出其长度错误的原因。可能来自web服务的消息被截断了?
      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;   
            }