我不是大师,我只是一个一般的程序猿。尤其期待大伙儿留言板留言探讨,不吝赐教。假如你改正我,我能检查程序和做实验,我的专业技能会提升。我认为这是一个程序猿的主要素质。

然后写一篇文章。

前几篇文章内容讲述了汇总优化算法MD5和SHA,文中详细介绍了对称性加密技术AES,它是真真正正的加密技术。以上汇总优化算法只有用以获取汇总信息内容来较为文档的一致性,这也是不可逆的,没法复原数据加密数据信息。

或是前一句,只谈使用方法,不谈实际标准,由于我不懂。

简单点来说,给予一个根据优化算法数据加密一段密文数据信息的密匙。锁匙长短越长,越安全性。

数据加密后的参数可以用一样的密匙破译,获得数据加密前的密文数据信息。由于读取和破译应用同样的密匙,因此也称之为对称加密。稍候,我将详细介绍数据加密和破译应用不一样的密匙,称之为对称加密。

常见的对称性加密技术有DES(全名数据库加密规范),3DES(称之为三重DES)是DES的增强版,今日要详细介绍的AES比DES和3DES更安全性。

这也是数据加密和破译编码。

最先,java中AES的默认设置密匙的长度是128位。假如必须延长,还可以。实际上128位就可以了。怎么设置128字节数的登陆密码?大家不太可能每一次都记牢128个字节数,因此大家应用前边看到的hash算法。例如MD5能够把一切数据交换成128字节数,如果你的数据信息不会改变,变换后的128字节数就不容易变。因而,假如您的设置密码为123456,那麼您的AES数据加密密匙将根据MD5散列入123456字节数。破译时,还能够应用散列到与要破译的密匙同样的128字节数的123456。记牢123456比记牢128字节数要简易得多。自然AES的密匙并并不是根据MD5来的,因此我只是用大伙儿较为熟知的MD5做为事例来表明这一观念。

下列就是我梳理应用的java中AES的加密解密编码。c#和python都是有完善的编码,构思是一样的。

/** * 根据对随意登陆密码开展散列计算获得128位密匙 * @param password * @return * @throws NoSuchAlgorithmException */public static SecretKeySpec getSecretKey(String password) throws NoSuchAlgorithmException {KeyGenerator kgen = KeyGenerator.getInstance("AES");// 建立AES的Key经营者SecureRandom ramdom = SecureRandom.getInstance("SHA1PRNG");ramdom.setSeed(password.getBytes()); kgen.init(128, ramdom); SecretKey secretKey = kgen.generateKey();// 依据客户登陆密码,转化成一个密匙 byte[] enCodeFormat = secretKey.getEncoded();// 回到基本上编码格式的密匙 System.out.println(enCodeFormat.length); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 变换为AES专用型密匙 return key;}/** * AES数据加密字符串数组 * * @param data 必须被数据加密的数据信息 * @param password 数据加密必须的登陆密码 * @return 保密 */public static byte[] encrypt(byte[] data, String password) {try {Cipher cipher = Cipher.getInstance("AES");// 建立密码器cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(password));// 复位为数据加密方式的密码器byte[] result = cipher.doFinal(data);// 数据加密return result;} catch (Exception e) {e.printStackTrace();}return null;}/** * 破译AES数据加密过的字符串数组 * * @param content * AES数据加密过了的內容 * @param password * 数据加密时的登陆密码 * @return 密文 */ public static byte[] decrypt(byte[] content, String password) { try { Cipher cipher = Cipher.getInstance("AES");// 建立密码器 cipher.init(Cipher.DECRYPT_MODE, getSecretKey(password));// 复位为破译方式的密码器 byte[] result = cipher.doFinal(content); return result; // 密文 } catch (Exception e) { e.printStackTrace(); } return null; }

评论(0条)

刀客源码 游客评论