GVKun编程网logo

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

28

在本文中,我们将带你了解JS常见加密AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码)-Python/JS实现在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的Andr

在本文中,我们将带你了解JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的Android编程加密算法小结(AES、Base64、RAS加密算法)、BASE64、MD5、SHA、HMAC几种加密算法、base64、sha256、MD5加密、C# Base64编码解码 ,Md5、Rsa加密解密

本文目录一览:

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现

JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64 - Python/JS实现


文章目录

  • JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64 - Python/JS实现
  • 前言
  • 一、编码,加密?
    • 1. 什么是编码?
    • 2. 什么是加密?
  • 二、常见编码
    • 1.Base64
    • 2. Base64 - JS实现
    • 3. Base64 - Python实现
    • 4.Unicode
    • 5.Urlencode
  • 三、线性散列算法(签名算法)MD5
    • @L_301_13@
    • 2. MD5 - JS实现
    • 3. MD5 - Python实现
  • 四、安全哈希算法 SHAI
    • 1. SHAI - JS实现
    • 2. SHAI - Python实现
  • 五、散列消息鉴别码 HMAC
    • 1.HMAC - JS实现
    • 2. HMAC - Python实现
  • 六、对称加密 AES、DES
    • 1. AES,DES介绍
    • 2. AES - JS实现
    • 3. DES - JS实现
    • 4. DES - Python实现
  • 七、非对称加密RSA
    • 1. RSA介绍
    • 2. JS-代码示例
  • 总结


前言

本文仅仅介绍了常见的一些JS加密,并记录了JS和Python的实现方式
常见的加密算法基本分为这几类:
(1)base64编码伪加密
(2)线性散列算法(签名算法)MD5
(3)安全哈希算法 SHAI
(4)散列消息鉴别码 HMAC
(5)对称性加密算法 AES,DES
(6)非对称性加密算法 RSA


提示:以下是本篇文章正文内容,下面案例可供参考

一、编码,加密?

1. 什么是编码?

编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码;

2. 什么是加密?

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。

二、常见编码

1.Base64

base64是基于64个可打印ascii字符对任意字节数据进行编码算法,base64是一种编码方式而不是加密算法。只是看上去像是加密而已;
Base64使用A–Z,a–z,0–9,+,/ 这64个字符实现对数据进行加密。

2. Base64 - JS实现

<html>
    <script type="text/javascript">
        // 创建Base64对象
        var Base64={_keyStr:"ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charat(s)+this._keyStr.charat(o)+this._keyStr.charat(u)+this._keyStr.charat(a)}return t},decode:function(e){var t="";var n,i;var s,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charat(f++));o=this._keyStr.indexOf(e.charat(f++));u=this._keyStr.indexOf(e.charat(f++));a=this._keyStr.indexOf(e.charat(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
        // 定义字符串
        var string = 'i am xz!';
        // 加密
        var encodedString = Base64.encode(string);
        alert(encodedString);
        // 解密
        var decodedString = Base64.decode(encodedString);
        alert(decodedString);
	</script>
</html>            

控制台打印

3. Base64 - Python实现

import base64                                   
                                          
str1 = 'i am xz'                                
str_encode = base64.b64encode(str1.encode())    
print("Base64编码:", str_encode)                  
str_decode = base64.b64decode(str_encode)       
print("Base64解码:", str_decode)                  

控制台打印

4.Unicode

Unicode是计算机中字符集,编码的一项业界标准,被称为统一码,万国码,表现形式一般以"\u"或"&#"开头;

5.Urlencode

urlencode是URL编码,也称作百分号编码,用于把url的符号进行转换;

三、线性散列算法(签名算法)MD5

1.MD5介绍

MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value)。
特征:MD5加密之后产生的是一个固定长度(32位或16位)的数据,常规讲MD5是不存在解密的。
使用场景:注册账号时的密码一般都是用的MD5加密。

2. MD5 - JS实现

<!DOCTYPE html>
<html lang="en">
    <!-- md5源码地址:https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js -->
    <!-- md5常用于登录-->
    <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
    <script type="text/javascript">
        var str1 = 'i am xz'
        var str_encode = md5(str1);
        alert(str_encode) // 在弹窗中输出文本 f0404c7b9bff0bde8d6df8b64759960f
    </script>
</html>  

控制台打印

3. MD5 - Python实现

import hashlib                
                              
str1 = 'i am xz'              
m = hashlib.md5()             
m.update(str1.encode('utf-8'))
str_encode = m.hexdigest()    
print("MD5加密:", str_encode)  # MD5加密: f0404c7b9bff0bde8d6df8b64759960f      

控制台打印

四、安全哈希算法 SHAI

1. SHAI - JS实现

<!DOCTYPE html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script>
        var str1 = 'i am xz';
        var str_encode = CryptoJS.SHA1(str1).toString(); // 注意:1是数字1
        alert(str_encode)  // 0e9f44d42516562396d7b8923542a6a4fc29cd5c
    </script>
</html>           

控制台打印

2. SHAI - Python实现

import hashlib
                                                                   
sha1 = hashlib.sha1()                                                            
str1 = 'i am xz'                                                                 
sha1.update(str1.encode())                                                       
str_encode = sha1.hexdigest()                                                    
print("SHAI加密:", str_encode)  # SHAI加密: 0e9f44d42516562396d7b8923542a6a4fc29cd5c           

控制台打印

五、散列消息鉴别码 HMAC

1.HMAC - JS实现

<!DOCTYPE html>
    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script>
        var key = 'key';
        var str1 = 'i am xz';
        var hash = CryptoJS.HmacSHA256(key, str1);
        var str_encode = CryptoJS.enc.Hex.stringify(hash);
        alert(str_encode)  // '11a7960cd583ee2c3f1ed910dbc3b6c3991207cbc527d122f69e84d13cc5ce5c'
    </script>
</html>  

控制台打印

2. HMAC - Python实现

import hmac                                                                                                 
import hashlib                                                                                              
key = 'key'                                                                                                 
str1 = 'i am xz'                                                                                            
mac = hmac.new(key=key.encode(), msg=str1.encode(), digestmod=hashlib.sha256)                               
mac.digest()                                                                                                
str_encode = mac.hexdigest()                                                                                
print("HMAC加密:", str_encode)  # HMAC加密: e5137adac855050a62c7434b01bb97229f9e1a8fd5b45364e4035d28885b0852       

控制台打印

六、对称加密 AES、DES

1. AES,DES介绍

AES和DES的区别:加密后密文长度的不同,DES加密后密文长度是8的整数倍,AES加密后密文长度是16的整数倍;
特征:对称加密特征,加密和解密需要相同的密钥DES;
应用场景:企业级开发使用DES足够安全,要求高使用AES;

2. AES - JS实现

<html>
	<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
		  var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位,长度不一致也没问题
		  var message = "i am xz";  // 需要加密的内容
		  // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
		  var encrypt = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey),  // 参数1=密钥,参数2=加密内容
              {
			    mode: CryptoJS.mode.ECB, // 为DES的工作方式
			    padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
		     }
          ).toString(); // toString=转字符串类型

		  alert(encrypt); // 在弹窗中打印字符串 2vcsEDJv9vAZZLgFLjkZ9A==

		  //解密
		  var decrypt = CryptoJS.AES.decrypt(encrypt, // 参数1=密钥,参数2=解密内容
              {
                mode: CryptoJS.mode.ECB,
                padding: CryptoJS.pad.Pkcs7
              }
          ).toString(CryptoJS.enc.Utf8); // toString=转字符串类型,并指定编码
		  alert(decrypt); // "i am xz"
	</script>
</html>                                                                                                                                                                                                                                                                                                                                      

控制台打印

3. DES - JS实现

<html>
	 <!-- 对称加密特征,加密和解密需要相同的密钥DES,AES-->
	<script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.js"></script>
    <script type="text/javascript">
		  var aseKey = "12345678"     // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
		  var message = "i am xiaozhou ?";  // 需要加密的内容
		  // 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
		  var encrypt = CryptoJS.DES.encrypt(message, // 为DES的工作方式
			    padding: CryptoJS.pad.Pkcs7  // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
		     }
          ).toString(); // toString=转字符串类型

		  alert(encrypt); // 控制台打印 CDVNwmEwDRM

		  //解密
		  var decrypt = CryptoJS.DES.decrypt(encrypt,并指定编码
		  alert(decrypt); // 控制台打印 "i am xiaozhou ?"
	</script>
</html>                                                                                                                                                                                       

控制台打印

4. DES - Python实现

pip 安装: pip intall pyDes -i https://pypi.tuna.tsinghua.edu.cn/simple

import binascii                                                                                                
from pyDes import des, CBC, PAD_PKCS5                                                                          
                                                                                                               
deskey = '12345678'                                                                                            
message = 'i am xz'                                                                                            
des_encrypt = des(key=deskey, mode=CBC, IV=deskey, padmode=PAD_PKCS5)                                          
str_encode = binascii.b2a_hex(des_encrypt.encrypt(message, padmode=PAD_PKCS5))  # .decode('utf-8')             
print("DES加密:", str_encode)  # DES加密: b'b8a5ac525c77aad0'                                                                                                                                                     
                                                                                                               
str_decrypt = des(key=deskey, padmode=PAD_PKCS5)                                          
str_decode = str_decrypt.decrypt(binascii.a2b_hex(str_encode), padmode=PAD_PKCS5)                              
print("DES解密:", str_decode)  # DES解密: b'i am xz'                                                                                                                                                                                                                                                                                                                                        

控制台打印

七、非对称加密RSA

1. RSA介绍

特征:加密使用公钥,解密使用私钥,公钥(可以公开暴露出来只能加密),私钥(必须隐藏),成对出现,私匙是通过公匙计算生成的,不能盲目随机生成,可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密;
公私匙在线生成:http://web.chacuo.net/netrsakeypair
应用场景:公开密钥加密和电子商业中RSA被广泛使用,支付密码会通过RSA加密;

2. JS-代码示例

<html>
    <!-- 公私匙可以在线生成:http://web.chacuo.net/netrsakeypair -->
    <!-- 非对称加密特征,加密使用公钥和解密使用私钥,公钥(可以公开暴露出来,只能加密)和私钥(必须隐藏)成对出现,公钥和私钥有着某种联系 RSA -->
	<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
    <script type="text/javascript">
        // 公钥 私匙是通过公匙计算生成的,不能盲目设置
        var PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALyBJ6kZ/VFJYTV3vOC07jqWIqgyvHulv6us/8wzlSBqQ2+eOTX7s5zKfXY40yZWDoCaIGk+tP/sc0D6dQzjaxECAwEAAQ==-----END PUBLIC KEY-----';
        //私钥
		var PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvIEnqRn9UUlhNXe84LTuOpYiqDK8e6W/q6z/zDOVIGpDb545NfuznMp9djjTJlYOgJogaT60/+xzQPp1DONrEQIDAQABAkEAu7DFsqQEDDnKJpiwYfUE9ySiIWNTNLJWZDN/Bu2dYIV4DO2A5aHZfMe48rga5BkoWq2LALlY3tqsOFTe3M6yoQIhAOSfSAU3H6jIOnlEiZabUrVGqiFLCb5Ut3Jz9NN+5p59AiEA0xQDMrxWBBJ9BYq6RRY4pXwa/MthX/8Hy+3GnvNw/yUCIG/3Ee578KVYakq5pih8KsveVjO37C2qj60d3Ok3XPqBAiEAqGPvxTsAuBDz0kcBIPqASGzArumljkrLsoHHkakOfU0CIDuhxKQwHlXFDO79ppYAPcVO3bph672qGD84YUaHF+pQ-----END PRIVATE KEY-----';
		//使用公钥加密
        var encrypt = new JSEncrypt();//实例化加密对象
        encrypt.setPublicKey(PUBLIC_KEY);//设置公钥
        var message = 'hello xiaozhou!' // 需要加密的数据 
        var encrypted = encrypt.encrypt(message);//对指定数据进行加密
		alert(encrypted)  // 'JQ83h8tmJpsSZcb4BJ3eQvuqIAs3ejepcUUnoFhQEvum8fA8bf1Y/fG+DO1bSIVNJF6EOZKe4wa0njv6aOar9w=='
        //使用私钥解密
        var decrypt = new JSEncrypt(); // 创建解密对象
        decrypt.setPrivateKey(PRIVATE_KEY); //设置私钥
        var uncrypted = decrypt.decrypt(encrypted); //解密 'hello xiaozhou!'
		alert(uncrypted);
    </script>
    <!-- 总结:可根据setPublicKey,setPrivateKey 确定是否为非对称RSA加密 -->
</html>

控制台打印


总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了JS的常见加密以及JS和Python(部分)的实现,后续有常用的JS加密会在这篇博客中持续更新;

Android编程加密算法小结(AES、Base64、RAS加密算法)

Android编程加密算法小结(AES、Base64、RAS加密算法)

本文实例总结了Android编程加密算法。分享给大家供大家参考,具体如下:

android常用加密算法之Base64加密算法:

package com.long;
/**
 * copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License,Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,software
 * distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/*
 * @author long
 *
 */
public class Base64 {
 private static final char[] legalChars = "ABCDEFGHIJKLMnopQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
   .tochararray();
 public static String encode(byte[] data) {
  int start = 0;
  int len = data.length;
  StringBuffer buf = new StringBuffer(data.length * 3 / 2);
  int end = len - 3;
  int i = start;
  int n = 0;
  while (i <= end) {
   int d = ((((int) data[i]) & 0x0ff) << 16)
     | ((((int) data[i + 1]) & 0x0ff) << 8)
     | (((int) data[i + 2]) & 0x0ff);
   buf.append(legalChars[(d >> 18) & 63]);
   buf.append(legalChars[(d >> 12) & 63]);
   buf.append(legalChars[(d >> 6) & 63]);
   buf.append(legalChars[d & 63]);
   i += 3;
   if (n++ >= 14) {
    n = 0;
    buf.append(" ");
   }
  }
  if (i == start + len - 2) {
   int d = ((((int) data[i]) & 0x0ff) << 16)
     | ((((int) data[i + 1]) & 255) << 8);
   buf.append(legalChars[(d >> 18) & 63]);
   buf.append(legalChars[(d >> 12) & 63]);
   buf.append(legalChars[(d >> 6) & 63]);
   buf.append("=");
  } else if (i == start + len - 1) {
   int d = (((int) data[i]) & 0x0ff) << 16;
   buf.append(legalChars[(d >> 18) & 63]);
   buf.append(legalChars[(d >> 12) & 63]);
   buf.append("==");
  }
  return buf.toString();
 }
 private static int decode(char c) {
  if (c >= 'A' && c <= 'Z')
   return ((int) c) - 65;
  else if (c >= 'a' && c <= 'z')
   return ((int) c) - 97 + 26;
  else if (c >= '0' && c <= '9')
   return ((int) c) - 48 + 26 + 26;
  else
   switch (c) {
   case '+':
    return 62;
   case '/':
    return 63;
   case '=':
    return 0;
   default:
    throw new RuntimeException("unexpected code: " + c);
   }
 }
 public static byte[] decode(String s) {
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  try {
   decode(s,bos);
  } catch (IOException e) {
   throw new RuntimeException();
  }
  byte[] decodedBytes = bos.toByteArray();
  try {
   bos.close();
   bos = null;
  } catch (IOException ex) {
   System.err.println("Error while decoding BASE64: " + ex.toString());
  }
  return decodedBytes;
 }
 private static void decode(String s,OutputStream os) throws IOException {
  int i = 0;
  int len = s.length();
  while (true) {
   while (i < len && s.charat(i) <= ' ')
    i++;
   if (i == len)
    break;
   int tri = (decode(s.charat(i)) << 18)
     + (decode(s.charat(i + 1)) << 12)
     + (decode(s.charat(i + 2)) << 6)
     + (decode(s.charat(i + 3)));
   os.write((tri >> 16) & 255);
   if (s.charat(i + 2) == '=')
    break;
   os.write((tri >> 8) & 255);
   if (s.charat(i + 3) == '=')
    break;
   os.write(tri & 255);
   i += 4;
  }
 }
}

android常用加密算法之AES加密算法:

package com.long;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
 * AES加密解密算法
 * 
 * @author long
 * 
 */
public class Encryption {
 private final static String HEX = "0123456789ABCDEF";
 public static String encrypt(String seed,String cleartext)
   throws Exception {
  byte[] rawKey = getRawKey(seed.getBytes());
  byte[] result = encrypt(rawKey,cleartext.getBytes());
  return toHex(result);
 }
 public static String decrypt(String seed,String encrypted)
   throws Exception {
  byte[] rawKey = getRawKey(seed.getBytes());
  byte[] enc = toByte(encrypted);
  byte[] result = decrypt(rawKey,enc);
  return new String(result);
 }
 private static byte[] getRawKey(byte[] seed) throws Exception {
  KeyGenerator kgen = KeyGenerator.getInstance("AES");
  SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
  sr.setSeed(seed);
  kgen.init(128,sr); // 192 and 256 bits may not be available
  SecretKey skey = kgen.generateKey();
  byte[] raw = skey.getEncoded();
  return raw;
 }
 private static byte[] encrypt(byte[] raw,byte[] clear) throws Exception {
  SecretKeySpec skeySpec = new SecretKeySpec(raw,"AES");
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
  byte[] encrypted = cipher.doFinal(clear);
  return encrypted;
 }
 private static byte[] decrypt(byte[] raw,byte[] encrypted)
   throws Exception {
  SecretKeySpec skeySpec = new SecretKeySpec(raw,"AES");
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.DECRYPT_MODE,skeySpec);
  byte[] decrypted = cipher.doFinal(encrypted);
  return decrypted;
 }
 public static String toHex(String txt) {
  return toHex(txt.getBytes());
 }
 public static String fromHex(String hex) {
  return new String(toByte(hex));
 }
 public static byte[] toByte(String hexString) {
  int len = hexString.length() / 2;
  byte[] result = new byte[len];
  for (int i = 0; i < len; i++)
   result[i] = Integer.valueOf(hexString.substring(2 * i,2 * i + 2),16).byteValue();
  return result;
 }
 public static String toHex(byte[] buf) {
  if (buf == null)
   return "";
  StringBuffer result = new StringBuffer(2 * buf.length);
  for (int i = 0; i < buf.length; i++) {
   appendHex(result,buf[i]);
  }
  return result.toString();
 }
 private static void appendHex(StringBuffer sb,byte b) {
  sb.append(HEX.charat((b >> 4) & 0x0f)).append(HEX.charat(b & 0x0f));
 }
}

Android常用加密算法之RAS加密算法:

import java.security.Key; 
import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.PKCS8EncodedKeySpec; 
import java.security.spec.X509EncodedKeySpec; 
import javax.crypto.Cipher; 
import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
public class RSAHelper { 
  public static PublicKey getPublicKey(String key) throws Exception { 
   byte[] keyBytes; 
   keyBytes = (new BASE64Decoder()).decodeBuffer(key); 
   X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); 
   KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
   PublicKey publicKey = keyFactory.generatePublic(keySpec); 
   return publicKey; 
  } 
  public static PrivateKey getPrivateKey(String key) throws Exception { 
   byte[] keyBytes; 
   keyBytes = (new BASE64Decoder()).decodeBuffer(key); 
   PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 
   KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
   PrivateKey privateKey = keyFactory.generatePrivate(keySpec); 
   return privateKey; 
  } 
  public static String getKeyString(Key key) throws Exception { 
   byte[] keyBytes = key.getEncoded(); 
   String s = (new BASE64Encoder()).encode(keyBytes); 
   return s; 
  } 
  public static void main(String[] args) throws Exception { 
   KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); 
   //密钥位数 
   keyPairGen.initialize(1024); 
   //密钥对 
   KeyPair keyPair = keyPairGen.generateKeyPair(); 
   // 公钥 
   PublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); 
   // 私钥 
   PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); 
   String publicKeyString = getKeyString(publicKey); 
   System.out.println("public:\n" + publicKeyString); 
   String privateKeyString = getKeyString(privateKey); 
   System.out.println("private:\n" + privateKeyString); 
   //加解密类 
   Cipher cipher = Cipher.getInstance("RSA");//Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
   //明文 
   byte[] plainText = "我们都很好!邮件:@sina.com".getBytes(); 
   //加密 
   cipher.init(Cipher.ENCRYPT_MODE,publicKey); 
   byte[] enBytes = cipher.doFinal(plainText); 
   //通过密钥字符串得到密钥 
   publicKey = getPublicKey(publicKeyString); 
   privateKey = getPrivateKey(privateKeyString); 
   //解密 
   cipher.init(Cipher.DECRYPT_MODE,privateKey); 
   byte[]deBytes = cipher.doFinal(enBytes); 
   publicKeyString = getKeyString(publicKey); 
   System.out.println("public:\n" +publicKeyString); 
   privateKeyString = getKeyString(privateKey); 
   System.out.println("private:\n" + privateKeyString); 
   String s = new String(deBytes); 
   System.out.println(s); 
  } 
}

希望本文所述对大家Android程序设计有所帮助。

BASE64、MD5、SHA、HMAC几种加密算法

BASE64、MD5、SHA、HMAC几种加密算法

本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。
    BASE64编码算法不算是真正的加密算法。
    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。 

BASE64 
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。 

如基本的单向加密算法: 

  • BASE64 严格地说,属于编码格式,而非加密算法

  • MD5(Message Digest algorithm 5,信息摘要算法)

  • SHA(Secure Hash Algorithm,安全散列算法)

  • HMAC(Hash Message Authentication Code,散列消息鉴别码)


    复杂的对称加密(DES、PBE)、非对称加密算法: 

  • DES(Data Encryption Standard,数据加密算法)

  • PBE(Password-based encryption,基于密码验证)

  • RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

  • DH(Diffie-Hellman算法,密钥一致协议)

  • DSA(Digital Signature Algorithm,数字签名)

  • ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)



    本篇内容简要介绍BASE64、MD5、SHA、HMAC、DES、PBE、RSA几种方法。 

    MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。


通过java代码实现如下:

  1. /** 
  2.  * BASE64解密 
  3.  *  
  4.  * @param key 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public static byte[] decryptBASE64(String key) throws Exception {  
  9.     return (new BASE64Decoder()).decodeBuffer(key);  
  10. }  
  11.   
  12. /** 
  13.  * BASE64加密 
  14.  *  
  15.  * @param key 
  16.  * @return 
  17.  * @throws Exception 
  18.  */  
  19. public static String encryptBASE64(byte[] key) throws Exception {  
  20.     return (new BASE64Encoder()).encodeBuffer(key);  
  21. }  


主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。

MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。



通过java代码实现如下:

  1. /** 
  2.  * MD5加密 
  3.  *  
  4.  * @param data 
  5.  * @return 
  6.  * @throws Exception 
  7.  */  
  8. public static byte[] encryptMD5(byte[] data) throws Exception {  
  9.   
  10.     MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
  11.     md5.update(data);  
  12.   
  13.     return md5.digest();  
  14.   
  15. }  



通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全。



通过java代码实现如下:

  1.     /** 
  2.      * SHA加密 
  3.      *  
  4.      * @param data 
  5.      * @return 
  6.      * @throws Exception 
  7.      */  
  8.     public static byte[] encryptSHA(byte[] data) throws Exception {  
  9.   
  10.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
  11.         sha.update(data);  
  12.   
  13.         return sha.digest();  
  14.   
  15.     }  
  16. }  



HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。



通过java代码实现如下:

  1. /** 
  2.  * 初始化HMAC密钥 
  3.  *  
  4.  * @return 
  5.  * @throws Exception 
  6.  */  
  7. public static String initMacKey() throws Exception {  
  8.     KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  9.   
  10.     SecretKey secretKey = keyGenerator.generateKey();  
  11.     return encryptBASE64(secretKey.getEncoded());  
  12. }  
  13.   
  14. /** 
  15.  * HMAC加密 
  16.  *  
  17.  * @param data 
  18.  * @param key 
  19.  * @return 
  20.  * @throws Exception 
  21.  */  
  22. public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  23.   
  24.     SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
  25.     Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  26.     mac.init(secretKey);  
  27.   
  28.     return mac.doFinal(data);  
  29.   
  30. }  



给出一个完整类,如下:

  1. import java.security.MessageDigest;  
  2.   
  3. import javax.crypto.KeyGenerator;  
  4. import javax.crypto.Mac;  
  5. import javax.crypto.SecretKey;  
  6.   
  7. import sun.misc.BASE64Decoder;  
  8. import sun.misc.BASE64Encoder;  
  9.   
  10. /** 
  11.  * 基础加密组件 
  12.  *  
  13.  * @author 梁栋 
  14.  * @version 1.0 
  15.  * @since 1.0 
  16.  */  
  17. public abstract class Coder {  
  18.     public static final String KEY_SHA = "SHA";  
  19.     public static final String KEY_MD5 = "MD5";  
  20.   
  21.     /** 
  22.      * MAC算法可选以下多种算法 
  23.      *  
  24.      * <pre> 
  25.      * HmacMD5  
  26.      * HmacSHA1  
  27.      * HmacSHA256  
  28.      * HmacSHA384  
  29.      * HmacSHA512 
  30.      * </pre> 
  31.      */  
  32.     public static final String KEY_MAC = "HmacMD5";  
  33.   
  34.     /** 
  35.      * BASE64解密 
  36.      *  
  37.      * @param key 
  38.      * @return 
  39.      * @throws Exception 
  40.      */  
  41.     public static byte[] decryptBASE64(String key) throws Exception {  
  42.         return (new BASE64Decoder()).decodeBuffer(key);  
  43.     }  
  44.   
  45.     /** 
  46.      * BASE64加密 
  47.      *  
  48.      * @param key 
  49.      * @return 
  50.      * @throws Exception 
  51.      */  
  52.     public static String encryptBASE64(byte[] key) throws Exception {  
  53.         return (new BASE64Encoder()).encodeBuffer(key);  
  54.     }  
  55.   
  56.     /** 
  57.      * MD5加密 
  58.      *  
  59.      * @param data 
  60.      * @return 
  61.      * @throws Exception 
  62.      */  
  63.     public static byte[] encryptMD5(byte[] data) throws Exception {  
  64.   
  65.         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
  66.         md5.update(data);  
  67.   
  68.         return md5.digest();  
  69.   
  70.     }  
  71.   
  72.     /** 
  73.      * SHA加密 
  74.      *  
  75.      * @param data 
  76.      * @return 
  77.      * @throws Exception 
  78.      */  
  79.     public static byte[] encryptSHA(byte[] data) throws Exception {  
  80.   
  81.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
  82.         sha.update(data);  
  83.   
  84.         return sha.digest();  
  85.   
  86.     }  
  87.   
  88.     /** 
  89.      * 初始化HMAC密钥 
  90.      *  
  91.      * @return 
  92.      * @throws Exception 
  93.      */  
  94.     public static String initMacKey() throws Exception {  
  95.         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  96.   
  97.         SecretKey secretKey = keyGenerator.generateKey();  
  98.         return encryptBASE64(secretKey.getEncoded());  
  99.     }  
  100.   
  101.     /** 
  102.      * HMAC加密 
  103.      *  
  104.      * @param data 
  105.      * @param key 
  106.      * @return 
  107.      * @throws Exception 
  108.      */  
  109.     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  110.   
  111.         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
  112.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  113.         mac.init(secretKey);  
  114.   
  115.         return mac.doFinal(data);  
  116.   
  117.     }  
  118. }  



再给出一个测试类:

  1. import static org.junit.Assert.*;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. /** 
  6.  *  
  7.  * @author 梁栋 
  8.  * @version 1.0 
  9.  * @since 1.0 
  10.  */  
  11. public class CoderTest {  
  12.   
  13.     @Test  
  14.     public void test() throws Exception {  
  15.         String inputStr = "简单加密";  
  16.         System.err.println("原文:/n" + inputStr);  
  17.   
  18.         byte[] inputData = inputStr.getBytes();  
  19.         String code = Coder.encryptBASE64(inputData);  
  20.   
  21.         System.err.println("BASE64加密后:/n" + code);  
  22.   
  23.         byte[] output = Coder.decryptBASE64(code);  
  24.   
  25.         String outputStr = new String(output);  
  26.   
  27.         System.err.println("BASE64解密后:/n" + outputStr);  
  28.   
  29.         // 验证BASE64加密解密一致性  
  30.         assertEquals(inputStr, outputStr);  
  31.   
  32.         // 验证MD5对于同一内容加密是否一致  
  33.         assertArrayEquals(Coder.encryptMD5(inputData), Coder  
  34.                 .encryptMD5(inputData));  
  35.   
  36.         // 验证SHA对于同一内容加密是否一致  
  37.         assertArrayEquals(Coder.encryptSHA(inputData), Coder  
  38.                 .encryptSHA(inputData));  
  39.   
  40.         String key = Coder.initMacKey();  
  41.         System.err.println("Mac密钥:/n" + key);  
  42.   
  43.         // 验证HMAC对于同一内容,同一密钥加密是否一致  
  44.         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(  
  45.                 inputData, key));  
  46.   
  47.         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));  
  48.         System.err.println("MD5:/n" + md5.toString(16));  
  49.   
  50.         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));  
  51.         System.err.println("SHA:/n" + sha.toString(32));  
  52.   
  53.         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));  
  54.         System.err.println("HMAC:/n" + mac.toString(16));  
  55.     }  
  56. }  



控制台输出:

  1. 原文:  
  2. 简单加密  
  3. BASE64加密后:  
  4. 566A5Y2V5Yqg5a+G  
  5.   
  6. BASE64解密后:  
  7. 简单加密  
  8. Mac密钥:  
  9. uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke  
  10. pBIpkd7QHg==  
  11.   
  12. MD5:  
  13. -550b4d90349ad4629462113e7934de56  
  14. SHA:  
  15. 91k9vo7p400cjkgfhjh0ia9qthsjagfn  
  16. HMAC:  
  17. 2287d192387e95694bdbba2fa941009a  



    BASE64的加密解密是双向的,可以求反解。
    MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。
    单向加密的用途主要是为了校验数据在传输过程中是否被修改。

base64、sha256、MD5加密

base64、sha256、MD5加密

异或可逆加密操作:A对B异或结果C;A对C异或结果为A;二次异或是本身
package en_decode; public class test { public static String xor(String input) { char[]chars=input.toCharArray(); for(int i=0;i<chars.length;i++) { chars[i]=(char) (chars[i]^3000); //^异或 } String new1=new String(chars); return new1; } public static void main(String[] args) { // TODO Auto-generated method stub String aString="abc"; aString=xor(aString); System.out.println(aString); aString=xor(aString); System.out.println(aString); } }

  

package en_decode;

import org.apache.commons.codec.digest.DigestUtils;

public class test {
//	public static String xor(String input) {
//		char[]chars=input.toCharArray();
//		for(int i=0;i<chars.length;i++) {
//			chars[i]=(char) (chars[i]^3000); //^异或
//		}
//		String new1=new String(chars);
//		return new1;
//	}
//	
	public static String MD5encode(byte[] input) {//速度快,不可逆 安全性低
		
		return DigestUtils.md5Hex(input);
		
	}
	public static String SHAencode(byte[] input) {//速度慢 不可逆 安全性高
		
		return DigestUtils.sha256Hex(input);
		
	}
	public static void main(String[] args) {
//		// TODO Auto-generated method stub
//		String aString="abc";
//		aString=xor(aString);
//		System.out.println(aString);
//		
//		aString=xor(aString);
//		System.out.println(aString);
		String gg="hello";
		String t1=MD5encode(gg.getBytes());
		System.out.println(t1);

		String t2=SHAencode(gg.getBytes());
		System.out.println(t2);
	}

}

  

package en_decode;
import org.apache.commons.codec.binary.Base64;
public class test {

    public static byte[] decode( String gg) {  
        return Base64.decodeBase64(gg);  
    }  
    public static String encode(byte[] bytes) {  
        return new String(Base64.encodeBase64(bytes));  
    }  
	public static void main(String[] args) {

		String gg="hello";
		gg=encode(gg.getBytes());
		System.out.println(gg);
		byte[]hh=decode(gg);
		System.out.println(new String(hh));
		
	}


}

  导入包:commons-codec-1.10

C# Base64编码解码 ,Md5、Rsa加密解密

C# Base64编码解码 ,Md5、Rsa加密解密

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace ClassLibrary1
{
    class Code
    {
        //1、base64  to  string
        public static string Base64Encrypt(string strPath)
        {
            byte[] bpath = Convert.FromBase64String(strPath);
            string returnData = Encoding.Default.GetString(bpath);
            return returnData;
        }


        //2、string   to  base64
        public static string Base64DesEncrypt(string strPath)
        {
            Encoding encode = Encoding.ASCII;
            byte[] bytedata = encode.GetBytes(strPath);
            string returnData = Convert.ToBase64String(bytedata, 0, bytedata.Length);
            return returnData;
        }

        /// <summary>
        /// 对字符串进MD5加密
        /// </summary>
        /// <param name="sourceStr">源类型</param>
        /// <returns>加密后字符串</returns>
        public static string Md5Encrypt(string sourceStr)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            //将要加密的字符串转换成字节数组
            byte[] palindata = Encoding.Default.GetBytes(sourceStr);
            //通过字节数组进行加密
            byte[] encryptdata = md5.ComputeHash(palindata);
            //将加密后的字节数组转换成字符串
            string returnData = Convert.ToBase64String(encryptdata);
            return returnData;
        }

        /// <summary>
        ///  Md5加密
        /// </summary>
        /// <param name="pToEncrypt">要加密的string</param>
        /// <param name="sKey">要加密的key</param>
        /// <returns></returns>
        public static string Md5Encrypt(string pToEncrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            des.Key = Encoding.ASCII.GetBytes(sKey);
            des.IV = Encoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }
            var s = ret.ToString();
            return s;
        }
        
        /// <summary>
        ///  Md5解密
        /// </summary>
        /// <param name="pToDecrypt">解密string</param>
        /// <param name="sKey">解密key(要8位数)</param>
        /// <returns></returns>
        public static string Md5Decrypt(string pToDecrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
            for (int x = 0; x < pToDecrypt.Length / 2; x++)
            {
                int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
                inputByteArray[x] = (byte) i;
            }
            des.Key = Encoding.ASCII.GetBytes(sKey);
            des.IV = Encoding.ASCII.GetBytes(sKey);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();

            return Encoding.Default.GetString(ms.ToArray());
        }


        public static CspParameters Param;
        /// <summary>
        /// 进行 RSA 加密
        /// </summary>
        /// <param name="sourceStr">源字符串</param>
        /// <returns>加密后字符串</returns>
        public static string RsaEncrypt(string sourceStr)
        {
            Param = new CspParameters();
            //密匙容器的名称,保持加密解密一致才能解密成功
            Param.KeyContainerName = "Navis";
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(Param))
            {
                //将要加密的字符串转换成字节数组
                byte[] plaindata = Encoding.Default.GetBytes(sourceStr);
                //通过字节数组进行加密
                byte[] encryptdata = rsa.Encrypt(plaindata, false);
                //将加密后的字节数组转换成字符串
                return Convert.ToBase64String(encryptdata);
            }
        }

        /// <summary>
        /// 通过RSA 加密方式进行解密
        /// </summary>
        /// <param name="codingStr">加密字符串</param>
        /// <returns>解密后字符串</returns>
        public static string RsaDesEncrypt(string codingStr)
        {
            Param = new CspParameters();
            Param.KeyContainerName = "Navis";
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(Param))
            {
                byte[] encryptdata = Convert.FromBase64String(codingStr);
                byte[] decryptdata = rsa.Decrypt(encryptdata, false);
                return Encoding.Default.GetString(decryptdata);
            }
        }
    }
}

 

今天关于JS常见加密 AES、DES、RSA、MD5、SHAI、HMAC、Base64(编码) - Python/JS实现的分享就到这里,希望大家有所收获,若想了解更多关于Android编程加密算法小结(AES、Base64、RAS加密算法)、BASE64、MD5、SHA、HMAC几种加密算法、base64、sha256、MD5加密、C# Base64编码解码 ,Md5、Rsa加密解密等相关知识,可以在本站进行查询。

本文标签: