JAVA上加密算法的实现用例笔记
- 格式:pdf
- 大小:767.03 KB
- 文档页数:5
Java加密与解密方法详解1. 引言在当今数字化时代,保护数据的安全性成为了一项重要的任务。
无论是在个人使用还是企业应用中,数据的加密和解密都是必不可少的环节。
而Java作为一门广泛应用于软件开发的编程语言,其提供了丰富的加密和解密方法,本文将对Java中的加密与解密方法进行详细的介绍和分析。
2. 对称加密算法对称加密算法是指加密和解密使用相同的密钥的算法。
Java中常用的对称加密算法有DES、AES等。
其中,DES是一种较早期的对称加密算法,它使用56位的密钥对数据进行加密和解密。
而AES是一种更加安全和高效的对称加密算法,它使用128位、192位或256位的密钥对数据进行加密和解密。
在Java中,使用对称加密算法进行加密和解密的步骤如下:(1)生成密钥:通过密钥生成器(KeyGenerator)生成一个密钥(Key)。
(2)初始化加密/解密器:通过Cipher类的getInstance方法获取加密/解密器,并设置加密/解密模式和密钥。
(3)加密/解密数据:调用加密/解密器的方法对数据进行加密/解密操作。
3. 非对称加密算法非对称加密算法是指加密和解密使用不同的密钥的算法。
Java中常用的非对称加密算法有RSA、DSA等。
其中,RSA是一种基于大数因子分解的非对称加密算法,它使用公钥和私钥对数据进行加密和解密。
在Java中,使用非对称加密算法进行加密和解密的步骤如下:(1)生成密钥对:通过密钥对生成器(KeyPairGenerator)生成一个密钥对(KeyPair)。
(2)获取公钥和私钥:通过密钥对获取公钥和私钥。
(3)初始化加密/解密器:通过Cipher类的getInstance方法获取加密/解密器,并设置加密/解密模式和密钥。
(4)加密/解密数据:调用加密/解密器的方法对数据进行加密/解密操作。
4. 哈希算法哈希算法是一种将任意长度的数据映射为固定长度的数据的算法。
Java中常用的哈希算法有MD5、SHA-1、SHA-256等。
如何在Java中进行数据的加密和解密在Java中,有多种加密和解密的算法可供选择,如对称加密算法、非对称加密算法和哈希算法等。
下面将介绍几种常见的加密和解密方法。
1.对称加密算法对称加密算法指的是使用相同密钥进行加密和解密的算法,常见的对称加密算法有DES、3DES、AES等。
DES加密算法是一种对称密钥算法,加密解密使用相同的密钥,密钥长度为56位。
以下是使用DES加密和解密的示例代码:```javaimport javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class DESExample {public static void main(String[] args) throws Exception { String plainText = "Hello World";String key = "abcdefgh"; //密钥必须是8位长度byte[] encryptedBytes = desEncrypt(plainText.getBytes(), key.getBytes());byte[] decryptedBytes = desDecrypt(encryptedBytes,key.getBytes());String decryptedText = new String(decryptedBytes);System.out.println("解密后的文本:" + decryptedText);}public static byte[] desEncrypt(byte[] plainText, byte[] keyBytes) throws Exception {SecretKey key = new SecretKeySpec(keyBytes, "DES");Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE, key);return cipher.doFinal(plainText);}public static byte[] desDecrypt(byte[] cipherText, byte[] keyBytes) throws Exception {SecretKey key = new SecretKeySpec(keyBytes, "DES");Cipher cipher = Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE, key);return cipher.doFinal(cipherText);}}```3DES加密算法是DES的一种改进版,使用3个不同的密钥对数据进行3次加密。
java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。
其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。
一种常见的密码加密方法是使用MessageDigest类进行加密。
这可以通过以下步骤实现:首先,将密码转换为字节数组。
然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。
接下来,使用update方法将密码的字节数组传递给MessageDigest实例。
最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。
另一种常见的方法是使用对称加密算法,例如AES或DES。
这些算法使用相同的密钥进行加密和解密。
在Java中,可以使用javax.crypto包中的类来实现对称加密。
通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。
此外,还可以使用非对称加密算法,例如RSA。
这种方法使用公钥对数据进行加密,然后使用私钥进行解密。
在Java中,可以使用java.security包中的类来实现非对称加密。
无论使用哪种方法,都需要注意密码安全的问题。
例如,密钥的安全存储和管理,以及密码传输过程中的安全性。
另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。
总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。
希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。
第1篇一、实验背景凯撒密码是一种古老的加密技术,由罗马皇帝凯撒发明。
它是一种替换加密,通过将明文字母表中的字母按照一个固定的偏移量进行替换,生成密文。
凯撒密码是最简单、最广为人知的加密技术之一,其加密和解密过程都非常简单。
二、实验目的1. 理解凯撒密码的加密和解密原理;2. 掌握凯撒密码的编程实现;3. 分析凯撒密码的安全性,了解其局限性;4. 比较凯撒密码与其他加密算法的差异。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验内容1. 凯撒密码加密和解密算法实现2. 凯撒密码安全性分析3. 凯撒密码与其他加密算法的比较五、实验步骤1. 凯撒密码加密和解密算法实现(1)定义凯撒密码加密和解密函数```pythondef caesar_encrypt(text, shift):encrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) + shiftif char.isupper():if shifted > ord('Z'):shifted -= 26elif char.islower():if shifted > ord('z'):shifted -= 26encrypted_text += chr(shifted) else:encrypted_text += charreturn encrypted_textdef caesar_decrypt(text, shift):decrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) - shiftif char.isupper():if shifted < ord('A'):shifted += 26elif char.islower():if shifted < ord('a'):shifted += 26decrypted_text += chr(shifted)else:decrypted_text += charreturn decrypted_text```(2)测试凯撒密码加密和解密函数```pythonif __name__ == "__main__":text = "Hello, World!"shift = 3encrypted_text = caesar_encrypt(text, shift)decrypted_text = caesar_decrypt(encrypted_text, shift)print("Original text:", text)print("Encrypted text:", encrypted_text)print("Decrypted text:", decrypted_text)```2. 凯撒密码安全性分析凯撒密码的安全性非常低,因为其密钥空间只有26个可能的值(即字母表中的字母数量)。
Java加密解密和数字签名完整代码⽰例常见的加密算法基本的单向加密算法:BASE64严格地说,属于编码格式,⽽⾮加密算法MD5(MessageDigestalgorithm5,信息摘要算法)SHA(SecureHashAlgorithm,安全散列算法)HMAC(HashMessageAuthenticationCode,散列消息鉴别码)复杂的对称加密(DES、PBE)、⾮对称加密算法:DES(DataEncryptionStandard,数据加密算法)PBE(Password-basedencryption,基于密码验证)RSA(算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman)DH(Diffie-Hellman算法,密钥⼀致协议)DSA(DigitalSignatureAlgorithm,数字签名)ECC(EllipticCurvesCryptography,椭圆曲线密码编码学)数字签名算法简述数字签名算法可以看做是⼀种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。
也就是说,数字签名算法是⾮对称加密算法和消息摘要算法的结合体。
特点数字签名算法要求能够验证数据完整性、认证数据来源,并起到抗否认的作⽤。
原理数字签名算法包含签名和验证两项操作,遵循私钥签名,公钥验证的⽅式。
签名时要使⽤私钥和待签名数据,验证时则需要公钥、签名值和待签名数据,其核⼼算法主要是消息摘要算法。
1. 消息摘要String beforeDegist = "asdf";System.out.println("摘要前:"+beforeDegist);//初始信息要转换成字节流的形式byte[] plainText = beforeDegist.getBytes("UTF8");//使⽤getInstance("算法")来获得消息摘要,这⾥使⽤SHA-1的160位算法或者MD5算法geDigest messageDigest = MessageDigest.getInstance("SHA-1");MessageDigest messageDigest = MessageDigest.getInstance("MD5");System.out.println("/n" + messageDigest.getProvider().getInfo());//开始使⽤算法messageDigest.update(plainText);//输出算法运算结果String afterDegist = new String(messageDigest.digest(),"UTF8");System.out.println("摘要后:"+afterDegist);2. 私钥加密/*** 此例⼦是对⼀个字符串信息,⽤⼀个私钥(key)加密,然后在⽤该私钥解密,验证是否⼀致* 私钥加密,是对称加密* 使⽤对称算法。
java简易字符加密规则Java简易字符加密规则是一种基于Java语言的字符加密算法,通过对字符进行特定的操作,实现对字符的加密和解密。
本文将介绍Java简易字符加密规则的原理和使用方法。
一、原理Java简易字符加密规则的原理是通过对字符的ASCII码值进行加密运算,从而改变字符的值和顺序。
具体的加密规则如下:1. 将字符的ASCII码值加上一个固定的偏移量,得到加密后的ASCII码值。
2. 将加密后的ASCII码值转换为字符。
二、使用方法Java简易字符加密规则可以通过以下步骤实现对字符的加密和解密:1. 定义一个字符串变量,存储待加密的字符。
2. 将字符串转换为字符数组,遍历字符数组。
3. 对每个字符进行加密或解密操作,得到加密或解密后的字符。
4. 将加密或解密后的字符拼接成一个新的字符串。
5. 输出加密或解密后的字符串。
三、示例代码下面是一个使用Java简易字符加密规则进行加密和解密的示例代码:```javapublic class SimpleCharEncryption {public static void main(String[] args) {// 待加密的字符String originalString = "Hello, World!";// 加密后的字符String encryptedString = encrypt(originalString);System.out.println("加密后的字符:" + encryptedString); // 解密后的字符String decryptedString = decrypt(encryptedString);System.out.println("解密后的字符:" + decryptedString); }// 加密方法public static String encrypt(String originalString) {StringBuilder encryptedString = new StringBuilder();char[] charArray = originalString.toCharArray();for (char c : charArray) {// 加密操作:将字符的ASCII码值加上偏移量char encryptedChar = (char) (c + 3);encryptedString.append(encryptedChar);}return encryptedString.toString();}// 解密方法public static String decrypt(String encryptedString) {StringBuilder decryptedString = new StringBuilder();char[] charArray = encryptedString.toCharArray();for (char c : charArray) {// 解密操作:将字符的ASCII码值减去偏移量char decryptedChar = (char) (c - 3);decryptedString.append(decryptedChar);}return decryptedString.toString();}}```四、注意事项在使用Java简易字符加密规则时,需要注意以下事项:1. 加密和解密的偏移量需要保持一致,否则无法正确解密。
Java常⽤加密算法实例总结本⽂实例总结了Java常⽤加密算法。
分享给⼤家供⼤家参考,具体如下:项⽬中第⼀次深⼊地了解到加密算法的使⽤,现第⼀阶段结束,将使⽤到的加密算法和⼤家分享⼀下:⾸先还是先给⼤家普及⼀下常⽤加密算法的基础知识基本的单向加密算法BASE64 严格地说,属于编码格式,⽽⾮加密算法MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm,安全散列算法)复杂的加密算法RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)DES/3DES(Digital Signature Algorithm,数字签名)国密算法SM2/SM4(是由国家密码管理局编制的⼀种商⽤密码分组标准对称算法)使⽤⽅法:base64public static byte[] encode2Base64(byte[] bytes) {byte[] bts = Base64.encodeBase64(bytes);return bts;}public static byte[] decode2Base64(String str) {byte[] bts = Base64.decodeBase64(str);return bts;}MD5public static String md5(String str) {try {MessageDigest digest = MessageDigest.getInstance("MD5");return new String(digest.digest(str.getBytes()));} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}SHA-1public static byte[] sha1ToBytes(String str) {try {MessageDigest digest = MessageDigest.getInstance("SHA-1");byte[] bts = digest.digest(str.getBytes());return bts;} catch (Exception e) {e.printStackTrace();}return null;}DES/3DESpublic static byte[] encryptMode(String keyStr, byte[] src) {try {// ⽣成密钥SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede");// 加密Cipher c1 = Cipher.getInstance("DESede");c1.init(Cipher.ENCRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (ng.Exception e3) {e3.printStackTrace();}return null;}public static byte[] decryptMode(String keyStr, byte[] src) {try {SecretKey deskey = new SecretKeySpec(keyStr.getBytes(), "DESede"); // 解密Cipher c1 = Cipher.getInstance("DESede");c1.init(Cipher.DECRYPT_MODE, deskey);return c1.doFinal(src);} catch (java.security.NoSuchAlgorithmException e1) {e1.printStackTrace();} catch (javax.crypto.NoSuchPaddingException e2) {e2.printStackTrace();} catch (ng.Exception e3) {e3.printStackTrace();}return null;}RSA/*** 初始化公密钥** @return* @throws Exception*/public static Map<String, Object> initKey() throws Exception {KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA"); kpGenerator.initialize(2048);KeyPair keyPair = kpGenerator.generateKeyPair();// 存储公钥PublicKey publicKey = keyPair.getPublic();// 存储密钥PrivateKey privateKey = keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>();keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 取出公钥** @param keyMap* @return*/public static String getPublicKey(Map<String, Object> keyMap) {Key key = (Key) keyMap.get("RSAPublicKey");return encode2Base64(new String(key.getEncoded()));}/*** 取出密钥** @param keyMap* @return*/public static String getPrivateKey(Map<String, Object> keyMap) {Key key = (Key) keyMap.get("RSAPrivateKey");return encode2Base64(new String(key.getEncoded()));}/*** 公钥加密** @param data* @param publicKey* @return* @throws Exception*/public static String encryptByPublicKey(String data, RSAPublicKey publicKey)throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);// 模长int key_len = publicKey.getModulus().bitLength() / 8;// 加密数据长度 <= 模长-11String[] datas = splitString(data, key_len - 11);String mi = "";// 如果明⽂长度⼤于模长-11则要分组加密for (String s : datas) {mi += bcd2Str(cipher.doFinal(s.getBytes()));}return mi;}/*** 私钥加密** @param data* @param privateKey* @return* @throws Exception*/public static String encryptByPrivateKey(String data,RSAPrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);// 模长int key_len = privateKey.getModulus().bitLength() / 8;// 加密数据长度 <= 模长-11String[] datas = splitString(data, key_len - 11);String mi = "";// 如果明⽂长度⼤于模长-11则要分组加密for (String s : datas) {mi += bcd2Str(cipher.doFinal(s.getBytes()));}return mi;}/*** 私钥解密** @param data* @param privateKey* @return* @throws Exception*/public static String decryptByPrivateKey(String data,RSAPrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);// 模长int key_len = privateKey.getModulus().bitLength() / 8;byte[] bytes = data.getBytes();byte[] bcd = ASCII_To_BCD(bytes, bytes.length);System.err.println(bcd.length);// 如果密⽂长度⼤于模长则要分组解密String ming = "";byte[][] arrays = splitArray(bcd, key_len);for (byte[] arr : arrays) {ming += new String(cipher.doFinal(arr));}return ming;}/*** ASCII码转BCD码**/public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {byte[] bcd = new byte[asc_len / 2];int j = 0;for (int i = 0; i < (asc_len + 1) / 2; i++) {bcd[i] = asc_to_bcd(ascii[j++]);bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4)); }return bcd;}public static byte asc_to_bcd(byte asc) {byte bcd;if ((asc >= '0') && (asc <= '9'))bcd = (byte) (asc - '0');else if ((asc >= 'A') && (asc <= 'F'))bcd = (byte) (asc - 'A' + 10);else if ((asc >= 'a') && (asc <= 'f'))bcd = (byte) (asc - 'a' + 10);elsebcd = (byte) (asc - 48);return bcd;}/*** BCD转字符串*/public static String bcd2Str(byte[] bytes) {char temp[] = new char[bytes.length * 2], val;for (int i = 0; i < bytes.length; i++) {val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');val = (char) (bytes[i] & 0x0f);temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');}return new String(temp);}/*** 拆分字符串*/public static String[] splitString(String string, int len) {int x = string.length() / len;int y = string.length() % len;int z = 0;if (y != 0) {z = 1;}String[] strings = new String[x + z];String str = "";for (int i = 0; i < x + z; i++) {if (i == x + z - 1 && y != 0) {str = string.substring(i * len, i * len + y);} else {str = string.substring(i * len, i * len + len);}strings[i] = str;}return strings;}/*** 拆分数组*/public static byte[][] splitArray(byte[] data, int len) {int x = data.length / len;int y = data.length % len;int z = 0;if (y != 0) {z = 1;}byte[][] arrays = new byte[x + z][];byte[] arr;for (int i = 0; i < x + z; i++) {arr = new byte[len];if (i == x + z - 1 && y != 0) {System.arraycopy(data, i * len, arr, 0, y);} else {System.arraycopy(data, i * len, arr, 0, len);}arrays[i] = arr;}return arrays;}以上就是本次项⽬中⽤到的加密算法,需要注意的是编码格式⼀定要双⽅统⼀,如果不⼀致则加解密不成功。
JA V A 使用数字证书加密解密文件总结目录1.编写目的 (3)2.JA V A生产数字证书 (4)2.1.1 keystore(JKS) 的生成 (4)2.1.2 导出公钥 (5)3.使用JKS私钥加密文件 (5)4.转换为PFX格式私钥 (6)5.使用PFX加密文件 (7)6 源代码 (8)6.1 用到的JAR包 (8)6.2 示例代码 (8)6.2.1 Test.java (8)6.2.2 RsaUtil.java (10)6.2.3 Base64.java (19)7.结束语 (26)1.编写目的学习RSA算法,读取数字证书中的私钥对文件进行加密,使用数字证书的公钥解密,这种方式就是RSA算法.自己对RSA算法的理解:⏹私钥加密公钥解密:如果用私钥对文件加密,发给别人,别人用我公布的公钥进行解密,实现这个文件就是我本人制作的,不是别人做的.⏹公钥加密私钥解密:如果别人用我的公钥加密文件,那么只能我一个人看,只有使用我的私钥进行解密,私钥一定是不能告诉其他人的.本文讲解如何用JKS私钥对文件进行加密,用对于CRT公钥进行解密,将JKS私钥转换为PFX格式私钥,并用PFX私钥对文件进行加密解密Jks:是JA V A的keytools证书工具支持的证书私钥格式pfx:是微软支持的私钥格式⏹2.JAVA生产数字证书为了实现数字证书加密文件,我们首先要制作几个数字证书,如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.2.1 keytool 创建数字证书Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:⏹密钥实体(Key entity):密钥(secret key)又或者是私钥⏹配对公钥(采用非对称加密):可信任的证书实体(trusted certificate entries),只包含公钥2.1.1 keystore(JKS) 的生成●分阶段生成:命令格式:keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore e:\yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码);示例:1)cmd下进入java/bin2)输入命令keytool -genkey -alias myalias-keypass 123456-keyalg RSA-keysize 1024 -validity 365 -keystore d: \myalias.keystore -storepass 123456●一次性生成:keytool -genkey -alias yushan -keypass yushan -keyalg RSA -keysize 1024 -validity 365 -keystore e:\yushan.keystore -storepass 123456 -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)";(中英文即可)无例图2.1.2 导出公钥命令:keytool -export -alias myalias -keystore d:\myalias.keystore -file d:\myalias.crt -storepass 123456创建结果:3.使用JKS私钥加密文件//工具类RSAUtil rsa = new RSAUtil();//从jks私钥中获取私钥加密串PrivateKey priKeyFromKs = rsa.getPriKeyFromKS("d:\\myalias.keystore","123456", "myalias", "123456");//从jks私钥中获取公钥解密串PublicKey pubKeyFromKS = rsa.getPubKeyFromKS("d:\\myalias.keystore", "123456", "myalias");//从crt公钥中获取公钥解密串PublicKey pubKeyFromCrt = rsa.getPubKeyFromCRT("d:\\myalias.crt");//用私钥串加密rsa.encryptWithPrv("d:\\file.xml",priKeyFromKs,"d:\\file_encWithKSPri.xml", true);//用jks公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromKS, true,"d:\\file_encWithKSPri_decKs.xml");//用crt公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromCrt, true, "d:\\file_encWithKSPri_decCrt.xml");4.转换为PFX格式私钥如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.4.1 转换工具转换工具我使用的是kestore-export下载kestore-export.rar 请百度搜索,我也会往CSDN上上传,请直接搜索kestore-export.rar。