加密方式汇总

加密技术

加密技术大体上分为 双向加密 和 单向加密 ,而双向加密又分为 对称加密 和非对称加密。
双向加密即明文加密后形成的密文,可以通过逆向算法还原出明文。而单向加密只是对信息进行了摘要计算,不能通过算法逆向生成明文。
单向加密从严格意思上说不能算是加密的一种,而只是摘要算法,常见的单向加密技术有BASE64(一种编码形式)、MD5、SHA、HMAC(消息认证码)。
双向加密技术可以分为 对称加密 与 非对称加密 两种。
(1)对称加密:即加密与解密用的是同一把秘钥,常用的对称加密技术有DES、AES等。
(2)非对称加密:加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等。
Java 对称加密(常见的对称加密算法:DES,AES,3DES等等)
1、DES算法

DES是1977年美国联邦信息处理标准中使用的一种对称密码技术,曾今被美国和其他国家政府银行使用。
不过现在已被暴力破解,不再安全可靠,我们除了用它解密以前的密文外,已不再使用DES了
2、AES
AES密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。



/*****************************************************
    * AES加密
    * @param content 加密内容
    * @param key 加密密码,由字母或数字组成
               此方法使用AES-128-ECB加密模式,key需要为16位
               加密解密key必须相同,如:abcd1234abcd1234
    * @return 加密密文
    ****************************************************/
   
   public static String enCode(String content, String key) {
       try {
           byte[] raw = key.getBytes();  //获得密码的字节数组
           SecretKeySpec skey = new SecretKeySpec(raw, "AES"); //根据密码生成AES密钥
           Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  //根据指定算法ALGORITHM自成密码器
           cipher.init(Cipher.ENCRYPT_MODE, skey); //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
           byte [] byte_content = content.getBytes("utf-8"); //获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码            
           byte [] encode_content = cipher.doFinal(byte_content); //密码器加密数据
           return Base64.encodeBase64String(encode_content); //将加密后的数据转换为字符串返回
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }  
   }

/*****************************************************
    * AES解密
    * @param content 加密密文
    * @param key 加密密码,由字母或数字组成
               此方法使用AES-128-ECB加密模式,key需要为16位
               加密解密key必须相同
    * @return 解密明文
    ****************************************************/
   
   public static String deCode(String content, String key) {
       try {
           byte[] raw = key.getBytes();  //获得密码的字节数组
           SecretKeySpec skey = new SecretKeySpec(raw, "AES"); //根据密码生成AES密钥
           Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  //根据指定算法ALGORITHM自成密码器
           cipher.init(Cipher.DECRYPT_MODE, skey); //初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥    
           byte [] encode_content = Base64.decodeBase64(content); //把密文字符串转回密文字节数组
           byte [] byte_content = cipher.doFinal(encode_content); //密码器解密数据
           return new String(byte_content,"utf-8"); //将解密后的数据转换为字符串返回
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       }  
   }

Java 非对称加密(常见的非对称加密算法:RSA,ECC,DH等等)
1,RSA
RSA 公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
特点:
广泛接受并实现,数据加密&数字签名,公钥加密、私钥解密,私钥加密、公钥解密,RSA相对比较慢,基于“大数因子分解”非对称加密算法的实现方式

/**
 * RSA公钥加密
 * @param str加密字符串
 * @param publicKey 公钥
 * @return 密文
 * @throws Exception加密过程中的异常信息
 */
public static String encrypt( String str, String publicKey) throws Exception{
    //base64编码的公钥
    byte[] decoded = Base64.decodeBase64(publicKey);
    RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePublic(new X509EncodedKeySpec(decoded));
    //RSA加密
    Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, pubKey);
    String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
    return outStr;
}

/**
 * RSA私钥解密
 * @param str加密字符串
 * @param privateKey私钥
 * @return 铭文
 * @throws Exception解密过程中的异常信息
 */
public static String decrypt(String str, String privateKey) throws Exception{
    //64位解码加密后的字符串
    byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
    //base64编码的私钥
    byte[] decoded = Base64.decodeBase64(privateKey);
    RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(KEY_ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(decoded));
    //RSA解密
    Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, priKey);
    String outStr = new String(cipher.doFinal(inputByte));
    return outStr;
}

Java 单向加密(不需要密匙)
Java一般需要获取对象MessageDigest来实现单项加密。

1、MD5(安全性低)
MD5 即Message-Digest Algorithm 5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

public static void main2(String[] args) throws Exception {
    //加密字符串
    String message = "123456";
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    //使用srcBytes更新摘要
    md5.update(message.getBytes());
    String str = new BigInteger(1, md5.digest()).toString(16);
    System.out.println(message + "\tmd5加密后的字符串为:" + str);
}

2、SHA(安全性高)
SHA 是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说时对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

public static void main(String[] args) throws Exception {
    //加密字符串
    String message = "123456";
    MessageDigest md5 = MessageDigest.getInstance("SHA");
    //使用srcBytes更新摘要
    md5.update(message.getBytes());
    String str = new BigInteger( md5.digest()).toString();
    System.out.println(message + "\tSHA加密后的字符串为:" + str);
}

总结:
当需要用到密码加密时,可以使用单向加密方式,这种加密是不可逆的,可以使用SHA加密算法。
当需要用到数据加密方式的话,可以使用双向加密,AES是对称加密,只需要定义一个密匙就可以进行加解密。只要不暴露源码,就可以保持加密。而非双向加密需要公匙和私匙。公开公匙可能会造成反编译推算出私匙从而进行破解。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值