内容发布更新时间 : 2024/11/18 18:49:40星期一 下面是文章的全部内容请认真阅读。
加密算法分类:
? 只能加密:SHA MD5 ? 既能加密也能解密:
对称:DES RC4 非对称:RSA
非对称加密技术开销比较大,不适合大文本的加密。
SHA加密算法 SHA加密算法用途
数字签名、数字时间戳、数字证书
SHA加密原理以及流程
在SHA1算法中,我们必须把原始 消息(字符串,文件等)转换成位字符串位。SHA1算法只接受位作为输入。假设我们对字符串”abc”产生消息摘要(也就是加密)。首先,我们将它转换成位字符串如下: 01100001 01100010 01100011 ‘a’=97 ‘b’=98 ‘c’=99
这个位字符串的长度为24。下面我们需要5个步骤来计算SHA。
① 补位
消息必须进行补位,以使其长度在对512取模以后的余数是448,也就是说,(补位后的消息长度)lenQ2=448。即使长度已经满足对512取模后余数是448,补位也必须要进行。补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448.总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位过程。
原始信息为:01100001 01100010 01100011
补位第一步:01100001 01100010 01100011 1(首先补一个1) 补位第二步:01100001 01100010 01100011 10....0(补423个0)
② 补长度
所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常一个64位的数据来表示原始消息的长度。在进行了补长度的操作以后,整个消息就变成下面这样了。如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。
③ ④ ⑤
Java代码实现SHA算法
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了, 但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/ public class SHAEncode {
public static final String KEY_SHA = \;
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 = Byte2HexStrUtil.byte2HexStr(digest); return encrpt; } }
MD5加密算法 MD5算法java实现
/**
* 获取加密后的字符串 * @param input * @return */
public static String md5Digest(String data) { try {
// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”) MessageDigest messageDigest =MessageDigest.getInstance(\);
// 输入的字符串转换成字节数组
byte[] inputByteArray = data.getBytes();
// inputByteArray是输入字符串转换得到的字节数组 messageDigest.update(inputByteArray);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest(); // 字符数组转换成字符串返回
return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) { return null; } }
public static String byteArrayToHex(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 =new char[byteArray.length * 2]; // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b>>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b& 0xf]; }
// 字符数组组合成字符串返回
return new String(resultCharArray); }