数据加密算法DES
数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM 的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。
DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。
攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。
DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。
IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。
由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。

一、3DES

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称,是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法,其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:   

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))   3DES解密过程为:P=Dk1(EK2(Dk3(C)))

 1  /**
 2      * 3des加密
 3      *
 4      * @param secretKey 密钥
 5      * @param msg       明文
 6      * @param algorithm 加密方式
 7      * @return 密文
 8      * @throws UtilException UtilException
 9      * @see [类、类#方法、类#成员]
10      */
11     public static byte[] encrypt(
12             SecretKey secretKey, byte[] msg, String algorithm)
13             throws UtilException {
14         try {
15             Cipher cipher = Cipher.getInstance(algorithm + ALGORITHM_3DESCBC);
16             cipher.init(Cipher.ENCRYPT_MODE, secretKey,
17                     new IvParameterSpec(BYTE_ARRAY), new SecureRandom());
18             return cipher.doFinal(msg);
19         } catch (NoSuchAlgorithmException e) {
20             throw new UtilException(e);
21         } catch (InvalidKeyException e) {
22             throw new UtilException(e);
23         } catch (NoSuchPaddingException e) {
24             throw new UtilException(e);
25         } catch (BadPaddingException e) {
26             throw new UtilException(e);
27         } catch (IllegalBlockSizeException e) {
28             throw new UtilException(e);
29         } catch (InvalidAlgorithmParameterException e) {
30             throw new UtilException(e);
31         }
32     }
33
34     /**
35      * 解码
36      *
37      * @param secretKey 密钥
38      * @param msg       密文
39      * @param algorithm 加密方式
40      * @return 明文
41      * @throws UtilException UtilException
42      * @see [类、类#方法、类#成员]
43      */
44     public static byte[] decrypt(
45             SecretKey secretKey, byte[] msg, String algorithm)
46             throws UtilException {
47         try {
48             Cipher cipher = Cipher.getInstance(algorithm + ALGORITHM_3DESCBC);
49             cipher.init(Cipher.DECRYPT_MODE, secretKey,
50                     new IvParameterSpec(BYTE_ARRAY), new SecureRandom());
51             return cipher.doFinal(msg);
52         } catch (NoSuchPaddingException e) {
53             throw new UtilException(e);
54         } catch (InvalidKeyException e) {
55             throw new UtilException(e);
56         } catch (IllegalBlockSizeException e) {
57             throw new UtilException(e);
58         } catch (BadPaddingException e) {
59             throw new UtilException(e);
60         } catch (NoSuchAlgorithmException e) {
61             throw new UtilException(e);
62         } catch (InvalidAlgorithmParameterException e) {
63             throw new UtilException(e);
64         }
65
66     }

二、AES

  AES(Advanced Encryption Standard),高级加密标准,   又称Rijndael加密法,AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。   该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhinedoll"。

  

 1 /**
 2      * AES 加解密
 3      * @param mode
 4      * @param password
 5      * @param textBytes
 6      * @return
 7      * @throws Exception
 8      */
 9     public static byte[] aes(int mode, String password, byte[] textBytes) throws Exception{
10         KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
11         //for windows and linux, the secure random need select a algorithm
12         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
13         secureRandom.setSeed(password.getBytes("utf-8"));
14         keyGenerator.init(128, secureRandom);
15         SecretKey secretKey = keyGenerator.generateKey();
16         byte[] encoded = secretKey.getEncoded();
17         SecretKeySpec secretKeySpec = new SecretKeySpec(encoded, "AES");
18         Cipher cipher = Cipher.getInstance("AES");// 创建密码器
19         cipher.init(mode, secretKeySpec);// 初始化
20         return cipher.doFinal(textBytes);
21     }
22
23     /**
24      * AES 加密
25      * @param password
26      * @param plainText
27      * @return
28      * @throws Exception
29      */
30     public static  String encrypt(String password, String plainText) throws Exception {
31         byte[] bytes =  aes(Cipher.ENCRYPT_MODE, password, plainText.getBytes("utf-8"));
32         return URLEncoder.encode(new String(Base64.encodeBase64(bytes), "utf-8"), "utf-8");
33     }
34
35     /**
36      * AES 解密
37      * @param password
38      * @param cipherText
39      * @return
40      * @throws Exception
41      */
42     public static String decrypt(String password, String cipherText)throws Exception{
43         byte[] cipherBytes = Base64.decodeBase64(URLDecoder.decode(cipherText,"utf-8").getBytes("utf-8"));
44         byte[] bytes = aes(Cipher.DECRYPT_MODE, password, cipherBytes);
45         return new String(bytes, "utf-8");
46     }

三、MD5、SHA  

  MD5(Message Digest algorithm 5,信息摘要算法),SHA(Secure Hash Algorithm,安全散列算法).

 

 1 /**
 2      * 对文本摘要,先base64 再md5摘要
 3      * @param text  明文
 4      * @param salt  加盐
 5      * @return
 6      * @throws UnsupportedEncodingException
 7      * @throws NoSuchAlgorithmException
 8      */
 9     public static byte[] digestText(String text, String salt) throws UnsupportedEncodingException,
10             NoSuchAlgorithmException {
11         byte[] bytes = Base64.encodeBase64(text.getBytes("UTF-8"));
12         MessageDigest messageDigest = MessageDigest.getInstance("MD5");
13         //加入干扰(加盐技术的基本原理是,在用户输入的口令前面加上一串随机数(称为盐),然后将随机数和口令组合在一起计算消息摘要。最后将随机数(盐)和消息摘要一起保存。)
14       messageDigest.update(salt.getBytes("UTF-8"));
15         messageDigest.update(bytes);
16         return  messageDigest.digest()).
17     }

四、对称加密算法

   对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。 其优点在于加解密的高速度和使用长密钥时的难破解性。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量成几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。

五、非对称加密算法

  与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫做非对称加密算法。  

详见参考:http://snowolf.iteye.com/blog/379860

转载于:https://www.cnblogs.com/java-zone/articles/2769525.html

加密算法 java相关推荐

  1. AES加密算法 Java与Python跨平台实现

    AES加密算法 Java与Python跨平台实现 什么是AES Java的实现 Python的实现 结果 什么是AES Note: 网上有很多实现代码但是鱼龙混杂,笔者摸索了半天,实现了AES加密文本 ...

  2. 【国产加密算法-java实现SM3】

    国产加密算法-java实现SM3 一.国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7.SM9.祖冲之密码算法(ZUC)那等等. 其 ...

  3. rsa加密算法java实例,java实现的RSA加密算法详解

    本文实例讲述了java实现的RSA加密算法.分享给大家供大家参考,具体如下: 一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥 公钥:可 ...

  4. MD5单向,加密算法-java

    md5算法是一种常见的单项加密算法,例如mysql中的MD5()函数: 今天记录一下关于Java模块的md5加密算法应用 与编写: md可以用到hibernate; 模块位于java.security ...

  5. 非对称加密算法 - Java加密与安全

    非对称加密算法我们从DH算法中可以看到密钥对是一种非常有用的加密算法 密钥对中publicKey是可以公开的,而privateKey则是需要保密的,由此奠定了非对称加密的基础 非对称加密就是加密和解密 ...

  6. 口令加密算法 - Java加密与安全

    口令加密我们在前面介绍了对称加密算法,他们的key其实一个byte数组,例如AES256算法,他的key实际上是一个32位的数组 我们普通的加入软件有所不同,我们在使用WinRAR这样的软件的时候,通 ...

  7. 对称加密算法 - Java加密与安全

    对称加密算法什么是对称加密算法呢?1. 对称加密算法就是加密和解密使用同一个密钥,例如我们使用WinRAR,对文件进行打包的时候,我们可以设置一个秘密,在解压的时候需要使用同一个密码,才能够正确的解压 ...

  8. AES加密算法java实现

    转载自: https://blog.csdn.net/zyhlwzy/article/details/77948165 AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度 ...

  9. aes加密算法 java实现,AES加密算法的java实现

    AES加密算法的java实现 package com.encryp; import java.security.InvalidKeyException; import java.security.No ...

  10. JAVA加密--AES加密算法JAVA实现及使用中的各种坑,超实用

    1. AES 1.1. 概念 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用 ...

最新文章

  1. 全球与中国固态电池市场深度研究及投资可行性评估报告2022-2028年
  2. python基础教程:装饰器
  3. SAP Spartacus在某些屏幕尺寸下无法正常工作的原因分析
  4. xp电脑主题包_怎么让手机变电脑?一个APP让你的安卓手机变Windows电脑
  5. RabbitMQ-使用@RabbitListener注解消费消息
  6. 数据库操作update,和insert为什么会有int的返回值
  7. postSql insert into 去重
  8. 有哪些比较好用的安卓模拟器(电脑端)
  9. 程序员应该有制定工作计划的意识
  10. iis下屏蔽php notice,apache、iis规则屏蔽拦截蜘蛛抓取
  11. guzzle 请求本地地址
  12. Oracle递归死循环怎么办?
  13. MySQL 的三个自问自答
  14. 使用Docker部署Spring-Boot-项目,带劲!
  15. 为什么OceanBase不适合银行的三点思考
  16. redis键值出现 \xac\xed\x00\x05t\x00的解决方法
  17. 阅读笔记 | Code to Comment “Translation”:Data, Metrics, Baselining Evaluation
  18. TUV南德为比亚迪汽车工业户用储能系统颁发欧洲安全认证证书
  19. 基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json)
  20. python表格数据_用python读取表格数据

热门文章

  1. Linux LVM动态扩容
  2. Java 集合-Arrays工具类的介绍
  3. CSS最基础的语法和三种引入方式
  4. ubuntu 16.04安装redis群集zz
  5. 数据库之“on”“where”区别
  6. Robotium测试报告的生成方法(下)
  7. 解决2010版办公软件打不开从系统中导出的Excel表格
  8. Java byte变成无符号整数~~~
  9. 变分自编码器(VAE)
  10. C 语言实例 - 判断奇数/偶数