Android的非对称加密与MD5加密

非对称加密与解密:RSA

RSA由于公钥和私钥不同,所以非对称加密算法可以极大的提高文件的安全性,RSA是可逆的,一个字符串可以经过rsa加密后,经过解密后的字符串传到对端如服务器上,在进行解密即可(前提条件是服务器知道解密的私钥)。

实例:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class RSAUtils {  
  2.     public static byte[] encrypt(byte[] data, PrivateKey privateKey) {  
  3.         byte[] ret = null;  
  4.         if(data!=null&&data.length>0){  
  5.             if(privateKey!=null&&privateKey.getEncoded().length>0){  
  6.                 Log.d("flag""-----------Length: " + privateKey.getEncoded().length);  
  7.                 try {  
  8.                     //1、创造加密引擎cipher  
  9.                     Cipher cipher = Cipher.getInstance("RSA");  
  10.                     //2、初始化  
  11.                     cipher.init(Cipher.ENCRYPT_MODE,privateKey);  
  12.                     //3、对数据进行加密  
  13.                     ret = cipher.doFinal(data);  
  14.                 } catch (NoSuchAlgorithmException e) {  
  15.                     e.printStackTrace();  
  16.                 } catch (NoSuchPaddingException e) {  
  17.                     e.printStackTrace();  
  18.                 } catch (InvalidKeyException e) {  
  19.                     e.printStackTrace();  
  20.                 } catch (BadPaddingException e) {  
  21.                     e.printStackTrace();  
  22.                 } catch (IllegalBlockSizeException e) {  
  23.                     e.printStackTrace();  
  24.                 }  
  25.             }  
  26.         }  
  27.         return ret;  
  28.     }  
  29. }  
[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends AppCompatActivity {  
  2.     private TextView show_key;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.         initView();  
  8.     }  
  9.   
  10.     private void initView() {  
  11.         show_key = ((TextView) findViewById(R.id.show_key));  
  12.     }  
  13.   
  14.     public void btnGenerateKey(View view) {  
  15.         //生成公钥私钥  
  16.         try {  
  17.             //1、得到创造者(keyPair)实例  
  18.             KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");  
  19.             //2、进行初始化  
  20.             //参数代表key的长度  
  21.             kpg.initialize(3096);  
  22.             //3、生成keyPair,当中包含一对key就是公钥和私钥  
  23.             KeyPair keyPair = kpg.generateKeyPair();  
  24.             //3、1获取公钥  
  25.             PublicKey aPublic = keyPair.getPublic();  
  26.             byte[] aPublicEncoded = aPublic.getEncoded();  
  27.             byte[] encode = Base64.encode(aPublicEncoded, Base64.DEFAULT);  
  28.             //将公钥存到sp  
  29.             SharedPreferences sp = getSharedPreferences("publicKey", MODE_PRIVATE);  
  30.             SharedPreferences.Editor editor = sp.edit();  
  31.             //向sp存入公钥  
  32.             editor.putString("publicKey",new String(encode));  
  33.             editor.commit();  
  34.             //3.2获取私钥  
  35.             PrivateKey aPrivate = keyPair.getPrivate();  
  36.             byte[] encoded = aPrivate.getEncoded();  
  37.             byte[] encode1 = Base64.encode(encoded, Base64.DEFAULT);  
  38.             //将私钥存入文件  
  39.             File file = new File(getCacheDir(),"aPrivate");  
  40.             try {  
  41.                 FileOutputStream fos = new FileOutputStream(file);  
  42.                 //将私钥写入文件  
  43.                 fos.write(encode1);  
  44.                 fos.close();  
  45.   
  46.             } catch (FileNotFoundException e) {  
  47.                 e.printStackTrace();  
  48.             } catch (IOException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.   
  52.             show_key.setText("公钥是: "new String(encode)+"\n"+  
  53.   
  54.             "私钥是:  "new String(encode1)  
  55.             );  
  56.   
  57.         } catch (NoSuchAlgorithmException e) {  
  58.             e.printStackTrace();  
  59.         }  
  60.   
  61.   
  62.     }  
  63.   
  64.     public void btnRSAEncrypt(View view) {  
  65.   
  66.         PrivateKey privateKey = null;  
  67.   
  68.         //私钥加密  
  69.   
  70.         File file  = new File(getCacheDir(),"aPrivate");  
  71.   
  72.         try {  
  73.             FileInputStream fis = new FileInputStream(file);  
  74.   
  75.             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  76.   
  77.             //读取流  
  78.             byte[] buf = new byte[1024];  
  79.   
  80.             while (true){  
  81.                 int len = fis.read(buf);  
  82.                 if(len==-1){  
  83.                     break;  
  84.                 }  
  85.                 baos.write(buf,0,len);  
  86.             }  
  87.   
  88.             byte[] result = baos.toByteArray();  
  89.   
  90.             //转换成私钥  
  91.             byte[] decode = Base64.decode(result, Base64.DEFAULT);  
  92.   
  93.             //私钥如何进行转化  
  94.   
  95.             KeyFactory factory = KeyFactory.getInstance("RSA");  
  96.   
  97.             //通过PKCS获取私钥  
  98.             PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decode);  
  99.   
  100.             privateKey = factory.generatePrivate(keySpec);  
  101.   
  102.             //获取公钥X509EncodedKeySpec  
  103.   
  104.   
  105.             fis.close();  
  106.             baos.close();  
  107.   
  108.         } catch (FileNotFoundException e) {  
  109.             e.printStackTrace();  
  110.         } catch (IOException e) {  
  111.             e.printStackTrace();  
  112.         } catch (NoSuchAlgorithmException e) {  
  113.             e.printStackTrace();  
  114.         } catch (InvalidKeySpecException e) {  
  115.             e.printStackTrace();  
  116.         }  
  117.   
  118.         byte[] data = "一行白鹭上青天".getBytes();  
  119.   
  120.         byte[] result = RSAUtils.encrypt(data,privateKey);  
  121.   
  122.         //处理数据  
  123.   
  124.         if (result != null) {  
  125.             byte[] encode = Base64.encode(result, Base64.DEFAULT);  
  126.   
  127.             show_key.setText(new String(encode));  
  128.         }else {  
  129.             show_key.setText("加密失败");  
  130.         }  
  131.     }  
  132.   
  133.     public void btnRSADecrypt(View view) {  
  134.     }  
  135. }  

MD5加密:

MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。即只能加密不能解密。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends AppCompatActivity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(R.layout.activity_main);  
  6.         try {  
  7.             //工厂模式  
  8.             MessageDigest md5 = MessageDigest.getInstance("MD5");  
  9.             byte[] hash = md5.digest("你们好啊,陌生人".getBytes());  
  10.             Log.d("flag""---------->hash.length :" + hash.length);  
  11.             int length = hash.length;  
  12.             for (int i = 0; i < length; i++) {  
  13.                 Log.d("flag""------hashValue: " + hash[i]);  
  14.             }  
  15.             //将返回的hash值进行&运算:0xFF(255)    取低八位  
  16.             //将0xFF转换成二进制:0000000000000000000…… 1111 1111  
  17.             StringBuilder builder = new StringBuilder((hash.length) * 2);  
  18.             //for循环进行&运算  
  19.             for (int i = 0; i < length; i++) {  
  20.                 int result = hash[i] & 0xFF;  
  21.                 Log.d("flag""------->result: " + result);  
  22.                 if (result <= 0x0f) {//判断进行运算后值小于等于16  
  23.                     builder.append(0);  
  24.                 }  
  25.                 //需要将十进制的result转换为16进制,显示结果就可以了  
  26.                 String hexString = Integer.toHexString(result);  
  27.                 builder.append(hexString);  
  28.             }  
  29.             Log.d("flag""Md5Digest之后结果: " + builder.toString());  
  30.   
  31.             /** 
  32.              * 没有判断是否小于等于16之前 
  33.              * e3a796ad2d9f93d83e826f288dc254a 
  34.              * 
  35.              * 判断之后的数据 
  36.              * e3a796ad2d9f93d83e0826f288dc254a 
  37.              * 
  38.              * 浏览器中数据 
  39.              * e3a796ad2d9f93d83e0826f288dc254a 
  40.              */  
  41.   
  42.             Log.d("flag""Md5Digest之后内容: " + builder.toString());  
  43.   
  44.         } catch (NoSuchAlgorithmException e) {  
  45.             e.printStackTrace();  
  46.         }  
  47.     }  
  48. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值