android加密解密算法

来源:互联网 发布:mysql安装后连接不上 编辑:程序博客网 时间:2024/06/11 14:36

三个常用加密解密

1.md5摘要


会将任何长度的转成16个byte数组

    public static String encode(String content){        MessageDigest digest= null;        try {            digest = MessageDigest.getInstance("MD5");        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        digest.update(content.getBytes());        byte []bytes=digest.digest();        Log.e( "encode: ",bytes.length+"" );        return getString(bytes);    }    private static String getString(byte[] b){        StringBuffer sb = new StringBuffer();        for(int i = 0; i < b.length; i ++){            sb.append(b[i]);        }        return sb.toString();    }
2.base64将任何byte数组转成string类型进行传输

在交互的时候用于传输图片或者文件,js中应用比较频繁


    //加密    public static String encoding(Context context){        String content= null;        try {            InputStream inputStream=context.getAssets().open("app检查.zip");            byte[]bytes=new byte[inputStream.available()];            inputStream.read(bytes);            content = Base64.encodeToString(bytes,Base64.DEFAULT);            inputStream.close();        } catch (IOException e) {            e.printStackTrace();        }        return content;    }    //解密    public static void decoding(String content){        File file=new File("/sdcard/5.zip");        FileOutputStream outputStream=null;        try {            if (!file.exists()){                file.createNewFile();            }            byte[]bytes=  Base64.decode(content.getBytes(),Base64.DEFAULT);             outputStream=new FileOutputStream(file);             outputStream.write(bytes);            outputStream.close();        } catch (IOException e) {            e.printStackTrace();        }    }
3.RSA加密解密

在客户端对数据使用公钥加密

在服务器端使用私钥进行解密

这个是百度百科上提供的各种方法可以直接使用。我使用的公钥和私钥是方法生成的代码中也有

呈现的状态也是以base64结果进行传输的:

   public static final String KEY_ALGORITHM = "RSA";    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";    private static final String PUBLIC_KEY = "RSAPublicKey";    private static final String PRIVATE_KEY = "RSAPrivateKey";    private static final String PRIVATE_KEY_VALUE = "MIICXAIBAAKBgQDJRCHXC/Gzu0Tyvuz42mS73dZ8SkQ/eEon2MIc4nB4JZgdMOAV\n" +            "gZ8SVlRQJ5+XRAL48SHKBobIMHv/WsQWw8ik0BkIY1Ze70j4ouwQXSoFUCZYqm3s\n" +            "PQiCQPYhxw2WiVvnvK8B8zbLHyaPJhxuUWebLiZnhFGX9SVrfMSOLxjiUQIDAQAB\n" +            "AoGBAKwah7llLEzdwUq2OttdnTAMtYFY3F1N1lOWhf6/Hx+OPjIP/j5FtimvCq/0\n" +            "AgMOlGAdiiBATnbXBuFH01AIIQRR2zoP2H1tsiWKCYN6lLjvehfgxu/seuPHtL9x\n" +            "EfKDisDH41liezP9GEab0K0epJJJ+0t6T6TurwkH8UVp+HPxAkEA6RBApS+xjPvP\n" +            "BNSxGU8wgdoVN/GZfEe5izATUQPaCQeW1amscy3K2SmYZQg7HYTPzxux1ABGevna\n" +            "Q3wSnECuvQJBAN0SyOOX2IKrEU4sJA7Ep8qBmnXuSgfS/JUeW1xtdaJlm/wvJiOW\n" +            "kYOmyKTAO/6qIdjdiwB1papfbOvaTIREtSUCQAZZ9QkLZbFL43ZkPXdNGytOwClI\n" +            "IkCqy7mpU71vd2+rj0a/Wv3Aj7ifU5HdSY8iYW9pd80pPMJ5MKOKLA+qC5kCQBYN\n" +            "Dp6tAbqe5539hyc19GqdnNOQji/TmsAhBAnnHSmyqulvpoU8Oo2AMFlGl3VicPfZ\n" +            "uUi1c23YENxBrQowdEUCQE6B8f55+QiBDkyuI4g5X7ciiBabgvgQ76eLTXZRqe49\n" +            "C70KYFcDEUq9CQlmqw5p5+iqbnc9iff4oEMqdsMbhnM=";    private static final String PUBLIC_KEY_VALUE="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJRCHXC/Gzu0Tyvuz42mS73dZ8\n" +            "SkQ/eEon2MIc4nB4JZgdMOAVgZ8SVlRQJ5+XRAL48SHKBobIMHv/WsQWw8ik0BkI\n" +            "Y1Ze70j4ouwQXSoFUCZYqm3sPQiCQPYhxw2WiVvnvK8B8zbLHyaPJhxuUWebLiZn\n" +            "hFGX9SVrfMSOLxjiUQIDAQAB";    public static byte[] decryptBASE64(String key) {        return Base64.decode(key,Base64.DEFAULT);    }    public static String encryptBASE64(byte[] bytes) {        return Base64.encodeToString(bytes,Base64.DEFAULT);    }    /**     * 用私钥对信息生成数字签名     *     * @param data       加密数据     * @param privateKey 私钥     * @return     * @throws Exception     */    public static String sign(byte[] data, String privateKey) throws Exception {        // 解密由base64编码的私钥        byte[] keyBytes = decryptBASE64(privateKey);        // 构造PKCS8EncodedKeySpec对象        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);        // KEY_ALGORITHM 指定的加密算法        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        // 取私钥匙对象        PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);        // 用私钥对信息生成数字签名        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);        signature.initSign(priKey);        signature.update(data);        return encryptBASE64(signature.sign());    }    /**     * 校验数字签名     *     * @param data      加密数据     * @param publicKey 公钥     * @param sign      数字签名     * @return 校验成功返回true 失败返回false     * @throws Exception     */    public static boolean verify(byte[] data, String publicKey, String sign)            throws Exception {        // 解密由base64编码的公钥        byte[] keyBytes = decryptBASE64(publicKey);        // 构造X509EncodedKeySpec对象        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);        // KEY_ALGORITHM 指定的加密算法        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        // 取公钥匙对象        PublicKey pubKey = keyFactory.generatePublic(keySpec);        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);        signature.initVerify(pubKey);        signature.update(data);        // 验证签名是否正常        return signature.verify(decryptBASE64(sign));    }    public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception{        // 对密钥解密        byte[] keyBytes = decryptBASE64(key);        // 取得私钥        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);        // 对数据解密        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());        cipher.init(Cipher.DECRYPT_MODE, privateKey);        return cipher.doFinal(data);    }    /**     * 解密<br>     * 用私钥解密     *     * @param data     * @param key     * @return     * @throws Exception     */    public static byte[] decryptByPrivateKey(String data, String key)            throws Exception {        return decryptByPrivateKey(decryptBASE64(data),key);    }    /**     * 解密<br>     * 用公钥解密     *     * @param data     * @param key     * @return     * @throws Exception     */    public static byte[] decryptByPublicKey(byte[] data, String key)            throws Exception {        // 对密钥解密        byte[] keyBytes = decryptBASE64(key);        // 取得公钥        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        Key publicKey = keyFactory.generatePublic(x509KeySpec);        // 对数据解密        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());        cipher.init(Cipher.DECRYPT_MODE, publicKey);        return cipher.doFinal(data);    }    /**     * 加密<br>     * 用公钥加密     *     * @param data     * @param key     * @return     * @throws Exception     */    public static byte[] encryptByPublicKey(String data, String key)            throws Exception {        // 对公钥解密        byte[] keyBytes = decryptBASE64(key);        // 取得公钥        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        Key publicKey = keyFactory.generatePublic(x509KeySpec);        // 对数据加密        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());        cipher.init(Cipher.ENCRYPT_MODE, publicKey);        return cipher.doFinal(data.getBytes());    }    /**     * 加密<br>     * 用私钥加密     *     * @param data     * @param key     * @return     * @throws Exception     */    public static byte[] encryptByPrivateKey(byte[] data, String key)            throws Exception {        // 对密钥解密        byte[] keyBytes = decryptBASE64(key);        // 取得私钥        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);        // 对数据加密        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());        cipher.init(Cipher.ENCRYPT_MODE, privateKey);        return cipher.doFinal(data);    }    /**     * 取得私钥     *     * @param keyMap     * @return     * @throws Exception     */    public static String getPrivateKey(Map<String, Key> keyMap)            throws Exception {        Key key = (Key) keyMap.get(PRIVATE_KEY);        return encryptBASE64(key.getEncoded());    }    /**     * 取得公钥     *     * @param keyMap     * @return     * @throws Exception     */    public static String getPublicKey(Map<String, Key> keyMap)            throws Exception {        Key key = keyMap.get(PUBLIC_KEY);        return encryptBASE64(key.getEncoded());    }    /**     * 初始化密钥     *     * @return     * @throws Exception     */    public static Map<String, Key> initKey() throws Exception {        KeyPairGenerator keyPairGen = KeyPairGenerator                .getInstance(KEY_ALGORITHM);        keyPairGen.initialize(1024);        KeyPair keyPair = keyPairGen.generateKeyPair();        Map<String, Key> keyMap = new HashMap(2);        keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥        keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥        return keyMap;    }
上面是工具类

在方法中如此调用:

public class RSAActivity extends AppCompatActivity {    private TextView textView1;    private EditText editText1;    private Button button1;    private Button button2;    private TextView textView2;    private Map<String, Key> map;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.rsa);        try {            //c初始化key            map = RSACoder.initKey();        } catch (Exception e) {            e.printStackTrace();        }        textView1 = ((TextView) findViewById(R.id.tv2));        textView2 = ((TextView) findViewById(R.id.tv3));        button1 = ((Button) findViewById(R.id.bt));        button2 = ((Button) findViewById(R.id.bt2));        editText1 = ((EditText) findViewById(R.id.et));        button1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String content=editText1.getText().toString();                byte []bytes=null;                try {               bytes = RSACoder.encryptByPublicKey(content,RSACoder.getPublicKey(map));                } catch (Exception e) {                    e.printStackTrace();                }                textView1.setText(RSACoder.encryptBASE64(bytes));            }        });        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String content=textView1.getText().toString();                byte []bytes=null;                byte []byte2=null;                try {                    bytes=   RSACoder.decryptBASE64(content);                    byte2 = RSACoder.decryptByPrivateKey(bytes,RSACoder.getPrivateKey(map));                } catch (Exception e) {                    e.printStackTrace();                }                textView2.setText(new String(byte2));            }        });    }}
然后提供一个工具用于生成随机的公钥私钥

http://pan.baidu.com/s/1kVPwrGF

虽然是32位的在64位电脑上也能正常使用

下面是生成的命令:

opensll工具公钥加密:genrsa -out rsa_private_key.pem 1024私钥解密:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem