0

私はC#でファイルを暗号化し、C#で暗号化されたファイルをAndroidアプリのJavaコードで復号化したいと思っています。それを行うための最良のアルゴリズムはAES256であることを知っています.Androidのコードは正しく動作します(暗号化と復号化)が、できます私のAndroidアプリでC#結果ファイルを復号化するには、次のコードを使用します(どうもありがとう):

暗号化および復号化のための関数 (android):

暗号化:

static void Encrypt() throws IOException, NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException {
        try {

            FileInputStream fis = new FileInputStream(Environment
                    .getExternalStorageDirectory().getAbsolutePath()
                    + "/logo.png");
            FileOutputStream fos = new FileOutputStream(Environment
                    .getExternalStorageDirectory().getAbsolutePath()
                    + "/Encrypted");


            SecretKeySpec aeskeySpec = new SecretKeySpec(
                    "12345678901234567890123456789012".getBytes(), "AES");

            tv.setText(aeskeySpec.getEncoded().toString());
            Cipher cipher = Cipher.getInstance("AES");

            cipher.init(Cipher.ENCRYPT_MODE, aeskeySpec);
            CipherOutputStream cos = new CipherOutputStream(fos, cipher);

            int b;

            byte[] d = new byte[8];
            while ((b = fis.read(d)) != -1) {
                cos.write(d, 0, b);

            }

            cos.flush();
            cos.close();
            fis.close();

        }// try
        catch (Exception e) {
            // TODO: handle exception
            tv.setText("Error :" + e.getMessage()); } }// encrypt

static void Decrypt() throws IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { File file = new File(Environment.getExternalStorageDirectory() .getAbsolutePath() + "/Encrypted"); FileInputStream fis = new FileInputStream(file); long length = file.length(); if (length > Integer.MAX_VALUE) { // File is too large } byte[] bytes = new byte[(int) length]; int offset = 0; int numRead = 0; bytes = IOUtils.toByteArray(fis); byte[] N = new byte[(int) length - offset]; int g, s = 0; for (g = offset; g < length; g++) { N[s++] = bytes[g]; } FileOutputStream fos = new FileOutputStream(Environment .getExternalStorageDirectory().getAbsolutePath() + "/Decrypted"); SecretKeySpec sks = new SecretKeySpec( "12345678901234567890123456789012".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); byte[] b = cipher.update(N); int j = 0; while (j < b.length) { fos.write(b[j]); j++; } fos.flush(); fos.close(); }

私はC#で暗号化するためにこのコードを使用します:

public void Encrypt(string FIStr, string FOStr, string PassKey) { FileStream fsInput = new FileStream(FIStr, FileMode.Open, FileAccess.Read); FileStream fsEncrypted = new FileStream(FOStr, FileMode.Create, FileAccess.Write); AesCryptoServiceProvider AES = new AesCryptoServiceProvider(); System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); byte[] bytes=encoding.GetBytes(PassKey); AES.Key = bytes; ICryptoTransform aesencrypt = AES.CreateEncryptor(); CryptoStream cryptostream = new CryptoStream(fsEncrypted, aesencrypt, CryptoStreamMode.Write); byte[] bytearrayinput = new byte[fsInput.Length]; fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); cryptostream.Close(); fsInput.Close(); fsEncrypted.Close();}

このコードは私のファイルを暗号化していますが、Androidアプリでこのファイルを復号化できません:(、助けてください、ありがとうございます。

4

1 に答える 1

0

ここにあなたのためのいくつかのアイデアがあります:

1) C# コードを使用して「hello」などの単純な文字列を暗号化し、サイトhttp://www.everpassword.com/aes-encryptorに移動して、正常に復号化されるかどうかを確認します。あなたの暗号化コードはうまく機能しています。同じことがあなたの Android コードにも当てはまります - 私が言及したのと同じサイトに行き、「ちょっとあなた」のような単純なものを暗号化し、暗号化された文字列をあなたの Android コードに渡し、それが正常に復号化されるかどうかを確認してください.

2) コードをざっと見てみると、Cipher.getInstance() の引数が Cipher.getInstance() の Android ドキュメントと比較して少しむき出しに見えることに気付きました - http://developer.android.com/reference/javax/crypto/Cipher .html - ドキュメントの上部にある引数の例に注目してください。モードやパディングなど、提供する「AES」に加えてパラメーターを指定します。Android のデフォルト モードとパディングが C# 暗号化のものと一致していますか? ちょっとした考え。

幸運を!

于 2012-08-12T06:21:26.510 に答える