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
阅读全文
0 0
- android加密解密算法
- Android Base64加密解密算法
- Android DES加密解密算法
- Android-RSA算法加密解密
- android 中文件加密 解密 算法实战
- android 中文件加密 解密 算法实战
- android 中文件加密 解密 算法实战
- Android用到的DES加密解密算法
- Android RSA加密解密算法解析
- Android RSA非对称加密解密算法
- 【加密】DES加密解密算法
- Java加密解密算法-AES加密解密
- Java加密解密算法-Base64加密解密
- Java加密解密算法-MD5加密解密
- Java加密解密算法-DES加密解密
- Java加密解密算法-PBE加密解密
- C#加密解密算法
- TripleDES加密、解密算法
- Caffe训练源码基本流程
- Qt 使用treeview
- Spring学习
- RBAC权限管理
- MyBatis中sql片段的定义与引用
- android加密解密算法
- 整合SSH框架及常见问题解决
- JSON的使用
- Ubuntu安装git
- java处理高并发高负载类网站的优化方法
- jstack和线程dump分析
- 新AlphaGo首度揭秘:单机运行,4个TPU,算法更强
- java.lang.AbstractMethodError二级缓存redis小问题1
- 阶乘之和