Java常用加密技术和代码研究总结.docx
- 文档编号:3369169
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:23
- 大小:77.27KB
Java常用加密技术和代码研究总结.docx
《Java常用加密技术和代码研究总结.docx》由会员分享,可在线阅读,更多相关《Java常用加密技术和代码研究总结.docx(23页珍藏版)》请在冰豆网上搜索。
Java常用加密技术和代码研究总结
【Java】常用加密技术与代码研究总结
从现在加密算法的复杂性来看Base64这种都不好意思说自己是加密,不过对于完全不懂计算机的人来说也够用了。
采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
Base64编码一般用于url的处理,或者说任何你不想让普通人一眼就知道是啥的东西都可以用Base64编码处理后再发布在网络上。
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjava.util.Base64;
importcom.amuro.strategy.IStrategy;
/**
*Base64算法基于64个基本字符,加密后的string中只包含这64个字符
*@authorAmuro
*
*/
publicclassBase64StrategyimplementsIStrategy
{
publicStringencode(Stringsrc)
{
byte[]encodeBytes=Base64.getEncoder().encode(src.getBytes());
returnnewString(encodeBytes);
}
publicStringdecode(Stringsrc)
{
byte[]decodeBytes=Base64.getDecoder().decode(src.getBytes());
returnnewString(decodeBytes);
}
}
2、Base64编码对应关系表
三、消息摘要算法(MessageDigest)
消息摘要(MessageDigest)又称为数字摘要(DigitalDigest)。
它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。
而HASH算法的单向性使得要找到哈希值相同的两个不同的输入消息,在计算上是不可能的。
所以数据的哈希值,即消息摘要,可以检验数据的完整性。
用大白话来说,任何一段数据应该都和人一样是唯一的,唯一的标识是什么,人类的话目前就是指纹,而数据的指纹是什么呢?
没错,就是消息摘要算法产生的这一段String。
比如我们在注册网站的时候,客户端向服务器传输的,应该是我们输入的密码进行消息摘要处理后的内容,这样就算服务器被攻破,Hack也无法知道用户真实的密码是什么。
不过有说现在MD5和SHA已经被攻破了,具体大家可以谷歌。
1、MD5
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
/**
*消息摘要算法
*@authorAmuro
*
*/
publicclassMD5StrategyimplementsIStrategy
{
publicStringencode(Stringsrc)
{
try
{
MessageDigestmd=MessageDigest.getInstance("MD5");
byte[]encodeBytes=md.digest(src.getBytes());
returnHex.encodeHexString(encodeBytes);
}
catch(NoSuchAlgorithmExceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
thrownewRuntimeException("MD5nodecode");
}
}
2、SHA
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
/**
*安全散列算法
*@authorAmuro
*
*/
publicclassSHAStrategyimplementsIStrategy
{
publicStringencode(Stringsrc)
{
try
{
MessageDigestmd=MessageDigest.getInstance("SHA");
md.update(src.getBytes());
returnHex.encodeHexString(md.digest());
}
catch(NoSuchAlgorithmExceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
thrownewRuntimeException("SHAnodecode");
}
}
四、对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
而因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
当然,安全性较低带来的优点就是优计算量小、加密速度快、加密效率高。
然并卵,现代计算机对这种级别的计算量早就不care了,安全才是最重要的。
1、DES
DES,全称为“DataEncryptionStandard”,中文名为“数据加密标准”,是一种使用密钥加密的块算法。
DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjavax.crypto.Cipher;
importjavax.crypto.KeyGenerator;
importjavax.crypto.SecretKey;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.DESKeySpec;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
/**
*
*@authorAmuro
*
*/
publicclassDESStrategyimplementsIStrategy
{
privateCiphercipher;
privateSecretKeygenerateKey;
publicStringencode(Stringsrc)
{
try
{
KeyGeneratorkeyGenerator=KeyGenerator.getInstance("DES");
keyGenerator.init(56);//size
SecretKeysecretKey=keyGenerator.generateKey();
byte[]keyBytes=secretKey.getEncoded();
DESKeySpecdesKeySpec=newDESKeySpec(keyBytes);
SecretKeyFactorysecretKeyFactory=SecretKeyFactory.getInstance("DES");
generateKey=secretKeyFactory.generateSecret(desKeySpec);
cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,generateKey);
byte[]resultBytes=cipher.doFinal(src.getBytes());
returnHex.encodeHexString(resultBytes);
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
try
{
cipher.init(Cipher.DECRYPT_MODE,generateKey);
byte[]result=Hex.decodeHex(src.toCharArray());
returnnewString(cipher.doFinal(result));
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
}
2、3DES3DES,也就是“TripleDES”,中文名“三重数据加密算法”,它相当于是对每个数据块应用三次DES加密算法。
由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjavax.crypto.Cipher;
importjavax.crypto.KeyGenerator;
importjavax.crypto.SecretKey;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.DESedeKeySpec;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
publicclass_3DESStrategyimplementsIStrategy
{
privateCiphercipher;
privateSecretKeygenerateKey;
publicStringencode(Stringsrc)
{
try
{
KeyGeneratorkeyGenerator=KeyGenerator.getInstance("DESede");
keyGenerator.init(168);//size
SecretKeysecretKey=keyGenerator.generateKey();
byte[]keyBytes=secretKey.getEncoded();
DESedeKeySpecdesKeySpec=newDESedeKeySpec(keyBytes);
SecretKeyFactorysecretKeyFactory=SecretKeyFactory.getInstance("DESede");
generateKey=secretKeyFactory.generateSecret(desKeySpec);
cipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,generateKey);
byte[]resultBytes=cipher.doFinal(src.getBytes());
returnHex.encodeHexString(resultBytes);
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
try
{
cipher.init(Cipher.DECRYPT_MODE,generateKey);
byte[]result=Hex.decodeHex(src.toCharArray());
returnnewString(cipher.doFinal(result));
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
}
3、AESAES,全称为“AdvancedEncryptionStandard”,中文名“高级加密标准”,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
AES加密算法作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。
AES设计有三个密钥长度:
128,192,256位。
相对而言,AES的128密钥比DES的56密钥强了1021倍。
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjavax.crypto.Cipher;
importjavax.crypto.KeyGenerator;
importjavax.crypto.SecretKey;
importjavax.crypto.spec.SecretKeySpec;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
publicclassAESStrategyimplementsIStrategy
{
privateCiphercipher;
privateSecretKeygenerateKey;
publicStringencode(Stringsrc)
{
try
{
KeyGeneratorkeyGenerator=KeyGenerator.getInstance("AES");
keyGenerator.init(128);//size
SecretKeysecretKey=keyGenerator.generateKey();
byte[]keyBytes=secretKey.getEncoded();
generateKey=newSecretKeySpec(keyBytes,"AES");
cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,generateKey);
byte[]resultBytes=cipher.doFinal(src.getBytes());
returnHex.encodeHexString(resultBytes);
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
try
{
cipher.init(Cipher.DECRYPT_MODE,generateKey);
byte[]result=Hex.decodeHex(src.toCharArray());
returnnewString(cipher.doFinal(result));
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
}
4、PBE
PBE,全称为“PasswordBaseEncryption”,中文名“基于口令加密”,是一种基于密码的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数杂凑多重加密等方法保证数据的安全性。
PBE算法没有密钥的概念,把口令当做密钥了。
因为密钥长短影响算法安全性,还不方便记忆,这里我们直接换成我们自己常用的口令就大大不同了,便于我们的记忆。
但是单纯的口令很容易被字典法给穷举出来,所以我们这里给口令加了点“盐”,这个盐和口令组合,想破解就难了。
同时我们将盐和口令合并后用消息摘要算法进行迭代很多次来构建密钥初始化向量的基本材料,使破译更加难了。
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
importjava.security.SecureRandom;
importjavax.crypto.Cipher;
importjavax.crypto.SecretKey;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.PBEKeySpec;
importjavax.crypto.spec.PBEParameterSpec;
importmons.codec.binary.Hex;
importcom.amuro.strategy.IStrategy;
/**
*基于口令的加密(password),对称+消息摘要
*@authorAmuro
*
*/
publicclassPBEStrategyimplementsIStrategy
{
privateCiphercipher;
privateSecretKeygenerateKey;
privatePBEParameterSpecpbeParameterSpec;
publicStringencode(Stringsrc)
{
try
{
SecureRandomsecureRandom=newSecureRandom();
byte[]salt=secureRandom.generateSeed(8);
Stringpassword="amuro";
PBEKeySpecpbeKeySpec=newPBEKeySpec(password.toCharArray());
SecretKeyFactorysecretKeyFactory=SecretKeyFactory.getInstance("PBEWITHMD5andDES");
generateKey=secretKeyFactory.generateSecret(pbeKeySpec);
pbeParameterSpec=newPBEParameterSpec(salt,100);
cipher=Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE,generateKey,pbeParameterSpec);
byte[]resultBytes=cipher.doFinal(src.getBytes());
returnHex.encodeHexString(resultBytes);
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
publicStringdecode(Stringsrc)
{
try
{
cipher.init(Cipher.DECRYPT_MODE,generateKey,pbeParameterSpec);
byte[]result=Hex.decodeHex(src.toCharArray());
returnnewString(cipher.doFinal(result));
}
catch(Exceptione)
{
e.printStackTrace();
}
returnnull;
}
}
五、非对称加密
非对称加密算法需要两个密钥来进行加密和解密,分别是公钥和私钥。
需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,反之亦然。
由于加密和解密使用的是两个不同的密钥,因此,这种算法叫做非对称加密算法。
1、RSA
其实,在早在1978年的时候,RSA就已经出现了,它是第一个既能用于数据加密也能用于数字签名的算法。
它易于理解和操作,也很流行。
其原理就如上面的工作过程所述。
RSA算法基于一个十分简单的数论事实:
将两个大素数相乘十分容易,但是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 常用 加密 技术 代码 研究 总结