bgyl2010ss 2013-09-17 02:12 采纳率: 0%
浏览 1210

关于加密的以下代码为什么无法在安卓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上就无法得出正确结果*/
  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-14 13:47
    关注

    该回答引用ChatGPT

    这段加密代码可能无法在安卓4.2.2上正常工作的原因可能是由于“SHA1PRNG”算法在安卓4.2之后被限制,可能会导致NoSuchAlgorithmException异常。解决方法是使用其他安全随机数生成器替换SecureRandom.getInstance("SHA1PRNG"),如SecureRandom.getInstance("SHA1PRNG", "Crypto"),或者在调用getRawKey方法时使用另一种生成密钥的方法,如KeyGenerator.getInstance("AES")。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)