龙空技术网

常用编-解码和加-解密

技术虾聊 98

前言:

目前兄弟们对“加解密技术”大概比较关切,咱们都需要学习一些“加解密技术”的相关知识。那么小编在网络上汇集了一些有关“加解密技术””的相关文章,希望小伙伴们能喜欢,小伙伴们一起来了解一下吧!

记录一些Java常用的编-解码和加-解密的使用

大部分情况下都是对二进制字节数组进行编-解码和加-解密操作,如果是字符串的话,通过String的getBytes方法,可以转成对应的字节数组,例如

byte[] bytes = "我是一段文本".getBytes(StandardCharsets.UTF_8);

示例都是使用jdk自带组件实现

base64

是将二进制数据转成可读的字符串,编码成为文本,便于处理,示例使用jdk自带Base64工具类,也可以用org.apache.commons.codec的工具类org.apache.commons.codec.binary.Base64

编码

import java.util.Base64;public static String encode(byte[] clearData) {    return Base64.getEncoder().encodeToString(bytes);}

解码

import java.util.Base64;public static String decode(String base64Str) {    byte[] bytes = Base64.getDecoder().decode(base64Str);    return new String(bytes, StandardCharsets.UTF_8);}
MD5

MD5是很常用的一种签名方法,可以用于密码的加密存储,数字签名,文件完整性验证等,

MD5算法是单向加密,md5加密后的密文,目前无法解密,安全系数相对来说比较高

加密签名

//使用org.apache.commons.codec.digest.DigestUtilspublic static byte[] md5(byte[] data) {    return DigestUtils.md5(data);}
//使用jdk自带方法:java.security.MessageDigestpublic byte[] md5(byte[] data) throws NoSuchAlgorithmException {    MessageDigest messageDigest = MessageDigest.getInstance("MD5");    return messageDigest.digest(data);}

AES

AES是双向加密的算法,使用对称密钥(公钥私钥一样),明文加密后,密文可以使用密钥解密,AES需要一个密钥进行加密解密,AES支持三种长度的密钥:128位,192位,256位

生成密钥

public static byte[] generateKey() throws Exception {    //密钥生成器    KeyGenerator kg = KeyGenerator.getInstance("AES");    kg.init(128, new SecureRandom());    // 生成秘密密钥    SecretKey secretKey = kg.generateKey();    // 获得密钥的二进制编码数据    return secretKey.getEncoded();}

加密

public static byte[] encrypt(byte[] key, byte[] data) throws Exception {    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");    Cipher cipher = Cipher.getInstance("AES");    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);    return cipher.doFinal(data);}

解密

public static String decrypt(byte[] key, byte[] data) throws Exception {    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");    Cipher cipher = Cipher.getInstance("AES");    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);    return cipher.doFinal(data);}

解密后的数据可以自行转成字符串,new String(byte[]);

RSA

RSA是一种非对称加密算法,它有两个密钥:公钥和私钥。它们是一对,如果用公钥进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,只有用对应的公钥才能解密。

一般情况下使用公钥加密,私钥解密

生成密钥对

/** * 生成密钥对 */public static KeyPair generateKeyPair() throws Exception {    // 实例化密钥对生成器        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");        // 初始化密钥对生成器,SecureRandom无需设置seed,用系统默认算法获取随机数        keyPairGen.initialize(KEY_SIZE, new SecureRandom());        // 生成密钥对        KeyPair keyPair = keyPairGen.generateKeyPair();        //公钥二进制数据        //byte[] publicKeyData = keyPair.getPublic().getEncoded();        //私钥二进制数据        //byte[] privateKeyData = keyPair.getPrivate().getEncoded();        return keyPair;}

密钥可以使用base64编码后写入文件中保存起来

公钥加密

/** * 公钥加密 */public static byte[] encryptWithPublicKey(byte[] data, byte[] publicKeyData) throws Exception {    //对公钥二进制数据进行编码    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyData);    //初始化密钥工厂,使用算法为RSA    KeyFactory keyFactory = KeyFactory.getInstance("RSA");    //生成公钥    PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);    // 对数据加密    Cipher cipher = Cipher.getInstance("RSA");    //设置为解密模式,密钥为公钥    cipher.init(Cipher.ENCRYPT_MODE, publicKey);    return cipher.doFinal(data);}

私钥解密

/** * 私钥解密 */public static byte[] decryptWithPrivateKey(byte[] data, byte[] privateKeyData) throws Exception {    //对私钥二进制数据进行编码    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyData);    //初始化密钥工厂,使用算法为RSA    KeyFactory keyFactory = KeyFactory.getInstance("RSA");    //生成私钥    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);    // 对数据解密,使用算法RSA    Cipher cipher = Cipher.getInstance("RSA");    //设置为解密模式,密钥为私钥    cipher.init(Cipher.DECRYPT_MODE, privateKey);    return cipher.doFinal(data);}

标签: #加解密技术 #加解密技术的作用 #java对encode进行解码