java加密解密算法_第1页
java加密解密算法_第2页
java加密解密算法_第3页
java加密解密算法_第4页
java加密解密算法_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、加密算法分类:v 只能加密:SHA MD5v 既能加密也能解密: 对称:DES RC4 非对称:RSA非对称加密技术开销比较大,不适合大文本的加密。SHA加密算法 SHA加密算法用途 数字签名、数字时间戳、数字证书 SHA加密原理以及流程在SHA1算法中,我们必须把原始 消息(字符串,文件等)转换成位字符串位。SHA1算法只接受位作为输入。假设我们对字符串”abc”产生消息摘要(也就是加密)。首先,我们将它转换成位字符串如下:01100001 01100010 01100011a=97 b=98 c=99这个位字符串的长度为24。下面我们需要5个步骤来计算SHA。1 补位 消息必须进行补位,以

2、使其长度在对512取模以后的余数是448,也就是说,(补位后的消息长度)len%512=448。即使长度已经满足对512取模后余数是448,补位也必须要进行。补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448.总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位过程。原始信息为:01100001 01100010 01100011补位第一步:01100001 01100010 01100011 1(首先补一个1)补位第二步:01100001 01100010 01100011 10.0(补423个0)2 补长度 所谓的补长度是将原始数据的

3、长度补到已经进行了补位操作的消息后面。通常一个64位的数据来表示原始消息的长度。在进行了补长度的操作以后,整个消息就变成下面这样了。如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。345 Java代码实现SHA算法/*SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/public class SHAEnc

4、ode public static final String KEY_SHA = "SHA1" public static String shaDigest(byte source) throws NoSuchAlgorithmException String encrpt = null;MessageDigest md = MessageDigest.getInstance(KEY_SHA);md.update(source);/得到数据摘要byte digest = md.digest();/把二进制数组转换成十六进制字符串encrpt = Byte2HexStrUti

5、l.byte2HexStr(digest);return encrpt; MD5加密算法 MD5算法java实现 /* * 获取加密后的字符串 * param input * return */ public static String md5Digest(String data) try / 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”) MessageDigest messageDigest =MessageDigest.getInstance("MD5"); / 输入的字符串转换成字节数组 byte inputByteArray = data.getBy

6、tes(); / inputByteArray是输入字符串转换得到的字节数组 messageDigest.update(inputByteArray); / 转换并返回结果,也是字节数组,包含16个元素 byte resultByteArray = messageDigest.digest(); / 字符数组转换成字符串返回 return byteArrayToHex(resultByteArray); catch (NoSuchAlgorithmException e) return null; public static String byteArrayToHex(byte byteArr

7、ay) / 首先初始化一个字符数组,用来存放每个16进制字符 char hexDigits = '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' ; / new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(

8、2的8次方等于16的2次方) char resultCharArray =new charbyteArray.length * 2; / 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去 int index = 0; for (byte b : byteArray) resultCharArrayindex+ = hexDigitsb>>> 4 & 0xf; resultCharArrayindex+ = hexDigitsb& 0xf; / 字符数组组合成字符串返回 return new String(resultCharArray);

9、DES加密算法1) 要被加密的数据被分割称为若干以64bit为单位的数据,如果位数不够,那么补00或者FF,然后按照表1进行置换操作。表1相当于一个函数。2) 把64位密钥按表2做置换,去除密钥中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥。 3)将56位有效密钥按表3左移位,总计进行16轮操作,每一轮移位结束之后,得 到的新的56位子密钥作为下一轮移位的有效密钥。总计得到16个56位的子密钥。 4)按照表4对16个子密钥进行置换压缩,压缩后每个子密钥中的第9,18,22,25,35,38,43,54共8位数据会丢失。此步骤完成后得到16个48

10、位的子密钥。 5)将第一步生成的16个有效数据的右半部分R1的32位的数据根据表5进行置换,由原32位扩展到48位。 6) 将扩展后的有效数据的新的R1和K1做异或运算得到16个48位的加密数据。7) 将第六步产生的48位的加密数据分为8个6位的数据,按照表6取值,每6位压缩成4位,最终形成8个4位的数据,组合成新的32位的数据。8) 将上步产生的32位的数据按照表7置换,生成新的32位的RR1数据。9) 把RR1和第一步产生的L【1】按位异或后的值赋给第一步产生的R【2】,然后原来的R【1】值赋给L【2】,得到新的L【2】和R【2】10) 回到第5步,重复运算第9步,每轮计算由R【i】,L【

11、i】,k【i】来计算。总计16轮结束,最终生成新的L【16】和R【16】11) 合并L【16】和R【16】为64位的数据,然后按照表8做置换,生成最终加密数据 DES加密算法java实现/* * DES加密 * param source * return */public static String desEncrypt(String source)if(source = null | source.length() =0)return null;try /DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();/从原始密钥数据创建一个DE

12、SKeySpec对象DESKeySpec dks = new DESKeySpec(DES_KEY.getBytes();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");/生产密钥SecretKey key = keyFactory.generateSecret(dks);/Cipher对象实际完成加密操作Cipher cipher = Cipher.getInstance("DES");/使用密钥初始化Cipher对象cipher.init(Cipher.ENCRYPT

13、_MODE,key,sr);byte data =source.getBytes();/加密byte encryptedData = cipher.doFinal(data);/转成16进制串String hexString = HexUtil.byte2HexStr(encryptedData);return hexString; catch (InvalidKeyException e) e.printStackTrace(); catch (NoSuchAlgorithmException e) e.printStackTrace(); catch (InvalidKeySpecExce

14、ption e) e.printStackTrace(); catch (NoSuchPaddingException e) e.printStackTrace(); catch (IllegalBlockSizeException e) e.printStackTrace(); catch (BadPaddingException e) e.printStackTrace();return null;/* * DES解密 * param source * return */public static String desDecrypt(String source)if(source = nu

15、ll | source.length() =0)return null;try /DES算法要求有一个可信任的随机数源SecureRandom sr = new SecureRandom();/从原始密钥数据创建一个DESKeySpec对象DESKeySpec dks = new DESKeySpec(DES_KEY.getBytes();SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey key = keyFactory.generateSecret(dks);/Ciphe

16、r对象实际完成解密操作Cipher cipher = Cipher.getInstance("DES");/使用密钥初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE,key,sr);/将十六进制串转成字节数组byte data =HexUtil.hex2Byte(source);/解密byte decryptedData = cipher.doFinal(data);return new String(decryptedData); catch (InvalidKeyException e) e.printStackTrace(); ca

17、tch (NoSuchAlgorithmException e) e.printStackTrace(); catch (InvalidKeySpecException e) e.printStackTrace(); catch (NoSuchPaddingException e) e.printStackTrace(); catch (IllegalBlockSizeException e) e.printStackTrace(); catch (BadPaddingException e) e.printStackTrace();return null;3DES加密算法 Java实现3DE

18、S加密算法 1、加入bcprov-jdk16-145.jar包支持 public class ThreeDESUtil / 算法名称 public static final String KEY_ALGORITHM = "desede" / 算法名称/加密模式/填充方式 public static final String CIPHER_ALGORITHM = "desede/CBC/NoPadding" /* */* * CBC加密 * param key 密钥 * param keyiv IV * param data 明文 * return Bas

19、e64编码的密文 * throws Exception */ public static byte des3EncodeCBC(byte key, byte keyiv, byte data) throws Exception Security.addProvider(new BouncyCastleProvider(); Key deskey = keyGenerator(new String(key); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); IvParameterSpec ips = new IvParameterSpe

20、c(keyiv); cipher.init(Cipher.ENCRYPT_MODE, deskey, ips); byte bOut = cipher.doFinal(data); for (int k = 0; k < bOut.length; k+) System.out.print(bOutk + " "); System.out.println(""); return bOut; /* */* * * 生成密钥key对象 * param KeyStr 密钥字符串 * return 密钥对象 * throws InvalidKeyExcept

21、ion * throws NoSuchAlgorithmException * throws InvalidKeySpecException * throws Exception */ private static Key keyGenerator(String keyStr) throws Exception byte input = HexString2Bytes(keyStr); DESedeKeySpec KeySpec = new DESedeKeySpec(input); SecretKeyFactory KeyFactory = SecretKeyFactory.getInsta

22、nce(KEY_ALGORITHM); return (Key) (KeyFactory.generateSecret(java.security.spec.KeySpec) (KeySpec); private static int parse(char c) if (c >= 'a') return (c - 'a' + 10) & 0x0f; if (c >= 'A') return (c - 'A' + 10) & 0x0f; return (c - '0') & 0x0

23、f; / 从十六进制字符串到字节数组转换 public static byte HexString2Bytes(String hexstr) byte b = new bytehexstr.length() / 2; int j = 0; for (int i = 0; i < b.length; i+) char c0 = hexstr.charAt(j+); char c1 = hexstr.charAt(j+); bi = (byte) (parse(c0) << 4) | parse(c1); return b; /* */* * CBC解密 * param key 密钥 * param keyiv IV * param data Base64编码的密文 * return 明文 * throws Exception */ public static byte des3DecodeCBC(byte key, byte keyiv, byte data) throws Exception Key

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论