0

コードを使用して Base-64 エンコードし、C# でデータを暗号化してから、ファイルを Android アプリに送り、そこで復号化を試みます。

問題は、「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));
  }

何が悪いのかわからない。キーの長さは特定のバイト数である必要がありますか?

4

1 に答える 1

2

コメントはすでに問題を特定しており、ここで重要な項目をデバッグするとすぐにそれがわかるはずです: 読んでいると思われる base 64 文字列です。

のファイルからバイトを収集しますbout。しかし、それを文字列表現に変換しようとしても、想像どおりにはなりません。"[B@2352544e]" のようなものになりtoString()、配列からの Java の内部デフォルトになります。代わりに、試してみてくださいnew String(bout.toByteArray(), Charset.forName("US-ASCII"))

于 2012-12-16T12:04:46.527 に答える