对称加密算法是说加密方和解密方使用相同的密钥.常见的对称加密算法包括4个,DES,DESede(3DES),AES,PBE.

本文讨论的内容是加密算法,不是Message Digest,不是编码.下面区分一下这三个概念.

加密算法是一对一映射,明文密文一一对应.加密是不明确的,是隐晦的.

信息摘要是一个密文对应多个明文,它只是明文整体的一个指纹,一个反映,一个摘要.

编码是一对一映射,是明确的,是显然易见的,比如base64编码.

一.DES(Data Encryption Standard)

DES(Data Encryption Standard)名叫数据加密标准.它明文分成64位一组分块加密,密钥也是64位.其中,密钥的第7,15,23,31,39,47,56,63位是为了凑成奇校验位(保证一个字节中1的个数为奇数个),所以密钥实际有效位数是56位.

java中的DES可以如下调用:

public class DES {
    private final static String KEY_DES = "DESede";
    static String tos(byte[] b) {
        String ans = "";
        for (int i = 0; i < b.length; i++) {
            ans += String.format("%02X", b[i]);
        }

        return ans;
    }
    public static void main(String[] args)
            throws NoSuchAlgorithmException, InvalidKeyException,
            NoSuchPaddingException, InvalidKeySpecException,
            IllegalBlockSizeException, BadPaddingException {
        SecureRandom secure = new SecureRandom("weidiao".getBytes());;
        KeyGenerator generator = KeyGenerator.getInstance(KEY_DES);
        generator.init(secure);
        byte[] key = generator.generateKey().getEncoded();
        // DESKeySpec dks = new DESKeySpec(key);
        // SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_DES);
        // SecretKey secretKey = factory.generateSecret(dks);
        // 上述三行代码与下面这行代码等效,但是上面代码只适用于DES,而下面的代码可以适用于很多其它加密方式
        // 实际上,下面这行代码会自动调用上述代码
        SecretKeySpec secretKey = new SecretKeySpec(key, KEY_DES);
        byte[] data = "123".getBytes();
        Cipher cipher = Cipher.getInstance(KEY_DES);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encrypt = cipher.doFinal(data);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decrypt = cipher.doFinal(encrypt);
        System.out.println("密钥: " + tos(key));
        System.out.println("原始数据: " + tos(data));
        System.out.println("加密后: " + tos(encrypt));
        System.out.println("解密后:" + tos(decrypt));
    }
}

二.DESede(DES encrypt-decrypt-encrypt)

DESede又名3DES,它并不是一种新的加密算法,而是在DES的基础上多运算了几次,使得加密效果更好,如果破解它需要花费原来三倍的时间.它充分利用了DES的可逆性,即充分利用了DES的明文密文为一对一映射.

DESede中的e表示加密,d表示解密,实际上3DES算法如下所示,e表示加密函数,d表示解秘函数,一共用到3对加解密密钥:

encrypt=e3(d2(e1(data)))

decrypt=d1(e2(d3(encrypt)))

将上述DES代码中的KEY_DES改成"DESede"即可运行DESede加密算法.

三.AES(Advanced Encryption Standard)

AES(高级加密标准)是为了替代DES(数据加密标准)而出现的.AES 设计有三个密钥长度:128,192,256 位。相对而言,AES 的 128 密钥比 DES 的 56 位密钥强了 1021 倍。WPA(无线局域网受保护访问协议)是一种新型的无线安全技术,它的实现就采用了AES加密.

将上述DES代码中的KEY_DES改成"AES"即可运行AES加密算法.

四.PBE(Password Base Encryption)

PBE算法是一个集大成者,它能够将消息摘要算法和对称加密算法整合起来.

前面说的DES,3DES,AES都是只需要一个密钥就能够进行加密,有人说这个密钥太难记了,能不能用用户密码作为密钥?试想如果有人知道了你的密码,什么加密都是没有用的,他们可以直接用你的密码进行登录,加密过程只能挡住想偷盗密码的人却不能挡住已经偷到密码的人.所以,用用户密码作为密钥是可行的.别人得不到你的密钥等价于别人得不到你的密码,这就是用密码作为密钥的合理性.

那么问题来了,密码通常很短,而上述DES和3DES需要64位公钥,AES需要128位公钥(还有更长的公钥).解决方法是用MD5或者SSHA将密码进行消息摘要,这样一来就可以将密码弄成固定长度了.所以PBE算法有如下几种类型:

  • PBEWithSHAAndDES
  • PBEWithSHAAndBlowfish
  • PBEWithSHAAnd128BitRC4
  • PBEWithSHAAndIDEA-CBC
  • PBEWithSHAAnd3-KeyTripleDES-CBC

如果害怕密码被试探出来,可以加点盐.PBE算法是支持加盐的,但是加盐之后的PBE需要把盐作为密钥.这样跟上面AES,DES,3DES之流又有何分别?所以对于这个算法加盐并无卵用,反倒破坏了它本身的优势----除了密码没有密钥,还是要把密码设置的复杂些,防止被试探出来.

PBE的优点是不需要来回传输密钥了,简单容易记忆.它的缺点正是它的优点,因为如果入侵者通过抓包抓到了密文,就算他不知道密码,也依旧能够使用密文进行登录,因为密码并不总是变.也就是说,密钥最好只能用一次.如果密钥固定,那就跟密码没有差别了.

使用java库中的对称加密算法的更多相关文章

  1. Java库中的LocalDate类

    Java库中的LocalDate类 类库设计者决定将保存时间与给时间点命名分开.所以标准Java类库分别包含了两个类:一个用来表示时间点的Date类:另一个是用来表示大家熟悉的日历表示法的LocalD ...

  2. 常用加密算法的Java实现总结(二) ——对称加密算法DES、3DES和AES

    1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发 ...

  3. JAVA加密解密DES对称加密算法

    下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子. 首先,生成一个密钥KEY. 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我们的类文件. ...

  4. java库中的具体的集合

    1.ArrayList  一种可以动态增长和缩减的索引序列:速度较慢适合用于不修改太多的元素    采用的数组 2.LinkEdList  一种可以在任何位置进行高效的插入和删除操作的有序序列,适合于 ...

  5. Java库中的集合

    集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效的插入和删除操作的有序序列 ArrayDeque 一种用循环数组实现的双端队列 H ...

  6. java库中具体集合

    ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列 ArrayDeque  一种用循环数组实现的双端队列 HashSet ...

  7. [转]理解SSL(https)中的对称加密与非对称加密

    加密 解密 Tweet   密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母. 早期的密码学 古希腊人用一种叫 Scytale 的工具加密.更快的工具是 transposition ...

  8. 2016年度最受欢迎的100个 Java 库

    [编者按]本文作者为 Henn Idan,主要介绍基于 GitHub 中的数据分析,得出的2016年度最受欢迎的100个 Java 库.本文系国内 ITOM 管理平台 OneAPM 编译呈现. 谁拔得 ...

  9. java泛型中的E,K,V,T,U,S

    注释: java 泛型类型使用大写形式,且比较短,这是常见的 在java库中,使用变量 E 表示集合的元素类型 K 和 V 分别表示数据库表数据的键key和值value的类型 T(如果有需要还可以使用 ...

随机推荐

  1. Html + Css思维导图

    最近整理的一份Html和Css的思维导图,共享给初学者使用. 各个知识点的详细案例介绍,后期会分阶段依次发布,希望对大家学习html和css有帮助. 如果对文中的知识点有异议,欢迎随时拍砖! 后期也回 ...

  2. AO安装需要Microsoft Visual Studio 2013?

    从接触ArcGIS9.2到 10.4,在不断升级的 过程中,既给我们带来了很多惊喜,也带来一些麻烦,因为ArcGIS版本不兼容.出于体验,安装了ArcGIS Desktop10.4,AO也得升到10. ...

  3. iOS开发-UI 从入门到精通(五)

    近日在做项目的时候,为了快捷适配屏幕采用了Storyboard,添加约束以后运行后发现一个问题(下面将以普通案例展示该问题);在4.7 甚至更大的屏幕下是没有问题的,如下图(4.7屏幕): 但是放到更 ...

  4. 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享

    架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是 CI/CD.Dev ...

  5. 转载文档:Storm实战常见问题及解决方案

    该文档为实实在在的原创文档,转载请注明: http://blog.sina.com.cn/s/blog_8c243ea30101k0k1.html 类型 详细 备注 该文档是群里几个朋友在storm实 ...

  6. winform窗体(一)——基本属性

    一.窗体设计界面 二.部分属性 1.基本 设计中的Name:窗体类的类名 AcceptButton:窗口的确定按钮Enter CancelButton:窗口按ESC的取消按钮 2.外观 Backcol ...

  7. git 命令使用总结

    聊下 git rebase -i 聊下git merge --squash 聊下git pull --rebase 聊下 git remote prune origin 聊下 git 使用前的一些注意 ...

  8. 聊下 git remote prune origin

    在你经常使用的命令当中有一个git branch –a 用来查看所有的分支,包括本地和远程的.但是时间长了你会发现有些分支在远程其实早就被删除了,但是在你本地依然可以看见这些被删除的分支. 你可以通过 ...

  9. 【转】Flex 布局语法教程

    网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...

  10. Writing to a MySQL database from SSIS

    Writing to a MySQL database from SSIS 出处  :  http://blogs.msdn.com/b/mattm/archive/2009/01/07/writin ...