加密算法分类:只能加密:SHAMD5既能加密也能解密:对称:DESRC4非对称:RSA非对称加密技术开销比较大,不适合大文本的加密。SHA加密算法SHA加密算法用途数字签名、数字时间戳、数字证书SHA加密原理以及流程在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串位。SHA1算法只接受位作为输入。假设我们对字符串”abc”产生消息摘要(也就是加密)。首先,我们将它转换成位字符串如下:011000010110001001100011‘a’=97‘b’=98‘c’=99这个位字符串的长度为24。下面我们需要5个步骤来计算SHA。①补位消息必须进行补位,以使其长度在对512取模以后的余数是448,也就是说,(补位后的消息长度)len%512=448。即使长度已经满足对512取模后余数是448,补位也必须要进行。补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448.总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位过程。原始信息为:011000010110001001100011补位第一步:0110000101100010011000111(首先补一个1)补位第二步:01100001011000100110001110....0(补423个0)②补长度所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常一个64位的数据来表示原始消息的长度。在进行了补长度的操作以后,整个消息就变成下面这样了。如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。③④⑤Java代码实现SHA算法/*SHA(SecureHashAlgorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/publicclassSHAEncode{publicstaticfinalStringKEY_SHA=SHA1;publicstaticStringshaDigest(byte[]source)throwsNoSuchAlgorithmException{Stringencrpt=null;MessageDigestmd=MessageDigest.getInstance(KEY_SHA);md.update(source);//得到数据摘要byte[]digest=md.digest();//把二进制数组转换成十六进制字符串encrpt=Byte2HexStrUtil.byte2HexStr(digest);returnencrpt;}}MD5加密算法MD5算法java实现/***获取加密后的字符串*@paraminput*@return*/publicstaticStringmd5Digest(Stringdata){try{//拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)MessageDigestmessageDigest=MessageDigest.getInstance(MD5);//输入的字符串转换成字节数组byte[]inputByteArray=data.getBytes();//inputByteArray是输入字符串转换得到的字节数组messageDigest.update(inputByteArray);//转换并返回结果,也是字节数组,包含16个元素byte[]resultByteArray=messageDigest.digest();//字符数组转换成字符串返回returnbyteArrayToHex(resultByteArray);}catch(NoSuchAlgorithmExceptione){returnnull;}}publicstaticStringbyteArrayToHex(byte[]byteArray){//首先初始化一个字符数组,用来存放每个16进制字符char[]hexDigits={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))char[]resultCharArray=newchar[byteArray.length*2];//遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去intindex=0;for(byteb:byteArray){resultCharArray[index++]=hexDigits[b4&0xf];resultCharArray[index++]=hexDigits[b&0xf];}//字符数组组合成字符串返回returnnewString(resultCharArray);}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位的子密钥。5)将第一步生成的16个有效数据的右半部分R[1]的32位的数据根据表5进行置换,由原32位扩展到48位。6)将扩展后的有效数据的新的R[1]和K[1]做异或运算得到16个48位的加密数据。7)将第六步产生的48位的加密数据分为8个6位的数据,按照表6取值,每6位压缩成4位,最终形成8个4位的数据,组合成新的32位的数据。8)将上步产生的32位的数据按照表7置换,生成新的32位的RR[1]数据。9)把RR[1]和第一步产生的L【1】按位异或后的值赋给第一步产生的R【2】,然后原来的R【1】值赋给L【2】,得到新的L【2】和R【2】10)回到第5步,重复运算第9步,每轮计算由R【i】,L【i】,k【i】来计算。总计16轮结束,最终生成新的L【16】和R【16】11)合并L【16】和R【16】为64位的数据,然后按照表8做置换,生成最终加密数据DES加密算法java实现/***DES加密*@paramsource*@return*/publicstaticStringdesEncrypt(Stringsource){if(source==null||source.length()==0){returnnull;}try{//DES算法要求有一个可信任的随机数源SecureRandomsr=newSecureRandom();//从原始密钥数据创建一个DESKeySpec对象DESKeySpecdks=newDESKeySpec(DES_KEY.getBytes());SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);//生产密钥SecretKeykey=keyFactory.generateSecret(dks);//Cipher对象实际完成加密操作Ciphercipher=Cipher.getInstance(DES);//使用密钥初始化Cipher对象cipher.init(Cipher.ENCRYPT_MODE,key,sr);byte[]data=source.getBytes();//加密byte[]encryptedData=cipher.doFinal(data);//转成16进制串StringhexString=HexUtil.byte2HexStr(encryptedData);returnhexString;}catch(InvalidKeyExceptione){e.printStackTrace();}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}catch(InvalidKeySpecExceptione){e.printStackTrace();}catch(NoSuchPaddingExceptione){e.printStackTrace();}catch(IllegalBlockSizeExceptione){e.printStackTrace();}catch(BadPaddingExceptione){e.printStackTrace();}returnnull;}/***DES解密*@paramsource*@return*/publicstaticStringdesDecrypt(Stringsource){if(source==null||source.length()==0){returnnull;}try{//DES算法要求有一个可信任的随机数源SecureRandomsr=newSecureRandom();//从原始密钥数据创建一个DESKeySpec对象DESKeySpecdks=newDESKeySpec(DES_KEY.getBytes());SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);SecretKeykey=keyFactory.generateSecret(dks);//Cipher对象实际完成解密操作Ciphercipher=Cipher.getInstance(DES);//使用密钥初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE,key,sr);//将十六进制串转成字节数组byte[]data=HexUtil.hex2Byte(source);//解密byte[]decryptedData=cipher.doFinal(data);returnnewString(decryptedData);}catch(InvalidKeyExceptione){e.printStackTrace();}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}catch(InvalidKeySpecExceptione){e.printStackTrace();}catch(NoSuchPaddingExceptione){e.printStackTrace();}catch(IllegalBlockSizeExceptione){e.printStackTrace();}catch(BadPaddingExceptione){e.printStackTrace();}returnnull;}3DES加密算法Java实现3DES加密算法1、加入bcprov-jdk16-145.jar包支持publicclassThreeDESUtil{//算法名称publicstaticfinalStringKEY_ALGORITHM=desede;//算法名称/加密模式/填充方式publicstaticfinalStringCIPHER_ALGORITHM=desede/CBC/NoPadding;/***//***CBC加密*@paramkey密钥*@paramkeyivIV*@paramdata明文*@returnBase64编码的密文*@throwsException*/p