2012-12-15 126 views
0

我正在使用代码对base64编码和加密c#中的数据,然后将文件发送到我的Android应用程序,我试图解密它。Base64编码数据问题(在c#中加密,在java中解密)

问题是,我得到一个“Base64编码输入字符串的长度不是4的倍数”。解密时出错:

(针对Android的Java代码):

try 
    { 
      Boolean inEvent = false; 

      // read encrypted file to string 
      BufferedInputStream fin = new BufferedInputStream(new FileInputStream(filename)); 
      ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
      byte buffer[] = new byte[8192]; 
      int read = fin.read(buffer); 
      while(read != -1) { 
       bout.write(buffer, 0, read); 
       read = fin.read(buffer); 
      } 
      fin.close(); 
      String encryptedText = bout.toByteArray().toString(); 
      String unencryptedText = ""; 

      // decrypt string 
      try 
      { 
       unencryptedText = Decrypt(encryptedText, sKey); <-- error occurs here 
      } 
      catch (Exception e) 
      { 
       alert(e.getMessage()); 
       return sched; 
      } 

解密方法:

protected String Decrypt(String text, String key) throws Exception 
{ 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
    byte[] keyBytes= new byte[16]; 
    byte[] b= key.getBytes("UTF-8"); 
    int len= b.length; 
    if (len > keyBytes.length) len = keyBytes.length; 
    System.arraycopy(b, 0, keyBytes, 0, len); 
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); 
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes); 
    cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec); 

    byte [] results = cipher.doFinal(Base64Coder.decode(text)); 
    return new String(results,"UTF-8"); 
} 

最后,这里是我与加密的C#代码:

(C#代码):

string Encrypt(string textToEncrypt, string key) 
    { 
    RijndaelManaged rijndaelCipher = new RijndaelManaged(); 
    rijndaelCipher.Mode = CipherMode.CBC; 
    rijndaelCipher.Padding = PaddingMode.PKCS7; 

    rijndaelCipher.KeySize = 0x80; 
    rijndaelCipher.BlockSize = 0x80; 
    byte[] pwdBytes = Encoding.UTF8.GetBytes(key); 
    byte[] keyBytes = new byte[0x10]; 
    int len = pwdBytes.Length; 
    if (len > keyBytes.Length) 
    { 
     len = keyBytes.Length; 
    } 
    Array.Copy(pwdBytes, keyBytes, len); 
    rijndaelCipher.Key = keyBytes; 
    rijndaelCipher.IV = keyBytes; 
    ICryptoTransform transform = rijndaelCipher.CreateEncryptor(); 
    byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt); 
    return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length)); 
    } 

不知道什么是错的。密钥的长度是否必须是特定长度的字节数?

+3

'bout.toByteArray()。toString()'没有任何用处,当然不base64编码任何东西。 –

+0

已确认。然而,这是在我试图解码字符串的Android应用程序的Java代码中。 – user1457227

+0

Base64是一种编码方式,无论如何都不加密,我的意思是你不会仅仅通过Base64编码得到任何安全性 – BuddhiP

回答

2

评论已经确定了问题,如果您在此调试关键项目,您会立即看到它:您认为您正在阅读的基本64字符串。

您从bout的文件中收集您的字节。但是你试图将它转换为字符串表示的做法并不像你想象的那样。这将会是“[B @ 2352544e]”,只是Java的内部默认toString()来自阵列。相反,请尝试new String(bout.toByteArray(), Charset.forName("US-ASCII"))