2 bgyl2010ss bgyl2010ss 于 2013.09.17 10:12 提问

关于加密的以下代码为什么无法在安卓4.2.2上正常工作

完整代码如下

package com.example.test;

import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {

    private EditText E1;
    private TextView T1,T2;
    private Button B1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        E1 = (EditText)findViewById(R.id.E1);
        T1 = (TextView)findViewById(R.id.T1);
        T2 = (TextView)findViewById(R.id.T2);
        B1 = (Button)findViewById(R.id.B1);
        B1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String S1=E1.getText().toString();
                T1.setText(S1);
                try{
                    String scode;
                    byte[] btest,braw,bseed,bencode;                        
                    String seedkey="123";
                    bseed = seedkey.getBytes("utf-8");
                    braw = getRawKey(bseed);
                    String tobyte = E1.getText().toString();
                    btest = tobyte.getBytes("utf-8");
                    bencode = encry(braw, btest);
                    scode = new String(bencode,"ISO8859-1");
                    //加密完成,以下开始解密

                    byte[] bdecodetext,bdecoderaw,bdecodeseed,bdecode;
                     String sdecodekey = "123";
                     bdecodeseed = sdecodekey.getBytes("utf-8");
                     bdecoderaw = getRawKey(bdecodeseed);
                     bdecodetext = scode.getBytes("ISO8859-1");
                     bdecode = decry(bdecoderaw,bdecodetext);
                     String text1 = new String(bdecode,"utf-8");
                     T2.setText(text1);
                }catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            private byte[] getRawKey(byte[] seed) throws NoSuchAlgorithmException{
                SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); // 获得一个随机数,传入的参数为默认方式。
                sr.setSeed(seed);  // 设置一个种子,这个种子一般是用户设定的密码。也可以是其它某个固定的字符串
                KeyGenerator keyGen = KeyGenerator.getInstance("AES");  // 获得一个key生成器(AES加密模式)
                keyGen.init(128, sr);      // 设置密匙长度128位
                SecretKey key = keyGen.generateKey();  // 获得密匙
                byte[] raw = key.getEncoded();   // 返回密匙的byte数组供加解密使用
                return raw;
            }
            private byte[] encry(byte[] raw, byte[] input) throws Exception {  // 加密
                SecretKeySpec keySpec = new SecretKeySpec(raw, "AES"); // 根据上一步生成的密匙指定一个密匙(密匙二次加密?)
                Cipher cipher = Cipher.getInstance("AES");  // 获得Cypher实例对象
                cipher.init(Cipher.ENCRYPT_MODE, keySpec);  // 初始化模式为加密模式,并指定密匙
                byte[] encode = cipher.doFinal(input);  // 执行加密操作。 input为需要加密的byte数组
                return encode;                         // 返回加密后的密文(byte数组)
                }
            private byte[] decry(byte[] raw, byte[] encode) throws Exception{ // 解密
                SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
                Cipher cipher = Cipher.getInstance("AES");
                cipher.init(Cipher.DECRYPT_MODE, keySpec);   // 解密的的方法差不多,只是这里的模式不一样
                byte[] decode = cipher.doFinal(encode);  // 加解密都通过doFinal方法来执行最终的实际操作
                return decode;
                }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
/*同样在Genymotion的虚拟机软件上测试,创建的Nexus S 4.1.1上最后就可以在T2上输出出来,在Galaxy Nexus 4.2.2上T2的内容就无法输出,以前完整的工程在实体机一台HTC的4.0.4机器上也能正确运行,但在一台华为4.2.2上就无法得出正确结果*/
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!