6

iPhone アプリの Objective C で暗号化クラスを使用していますが、Android アプリから Java で同じ機能を動作させるのに苦労しています。私の暗号化コードは次のとおりです。

NSString * _secret = @"password";
NSString * _key = @"1428324560542678";

StringEncryption *crypto = [[StringEncryption alloc] init];
NSData *_secretData = [_secret dataUsingEncoding:NSUTF8StringEncoding];
CCOptions padding = kCCOptionPKCS7Padding;
NSData *encryptedData = [crypto encrypt:_secretData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];

JAVA で複製しようとしましたが、同じデータをエンコードすると別の文字列が得られます。だから私は何か間違ったことをしていますが、それを理解することはできません。これが私のJAVAコードです:

byte[] key = "1428324560542678".getBytes();

Cipher c = null;
            try {
                c = Cipher.getInstance("AES/ECB/PKCS7Padding");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

SecretKeySpec k =  new SecretKeySpec(key, "AES");
            try {
                c.init(Cipher.ENCRYPT_MODE, k);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    try {
        EditText tv1passwordText = (EditText) findViewById(R.id.password);
        String password = URLEncoder.encode(tv1passwordText.getText().toString(), "UTF-8");

            byte[] encryptedData = c.doFinal( password.getBytes());

誰が私が間違っているのかを見ることができますか?

以下のコメントに基づいて getBytes を追加しましたが、生成される文字列はまだ異なります。

byte[] key = null;
            try {
                key = "1428324560542678".getBytes("UTF-8");
            } catch (UnsupportedEncodingException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }

            Cipher c = null;
            try {
                c = Cipher.getInstance("AES/ECB/PKCS7Padding");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            SecretKeySpec k =  new SecretKeySpec(key, "AES");
            try {
                c.init(Cipher.ENCRYPT_MODE, k);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                EditText tv1passwordText = (EditText) findViewById(R.id.password);

                byte[] password = tv1passwordText.getText().toString().getBytes("UTF-8");

                byte[] encryptedData = c.doFinal(password);
4

3 に答える 3

0

過去に問題を引き起こしたことに気付いたことの 1 つは、暗号化されている iOS 文字列が実際"Hello World\0"には . \0したがって、Java で文字列の末尾にa を追加してみて、同じ結果が得られるかどうかを確認してください。

さらに、URLEncoderJava のステップでは、iOS 側に存在しない追加の制御文字やその他のものを導入している可能性があります。この後のテキストと iOS 暗号化ステップに入るテキストを比較して、それらがまったく同じであることを確認することは価値があるかもしれません

于 2013-04-11T15:26:49.313 に答える