JAVA各种加密与解密方式

这篇具有很好参考价值的文章主要介绍了JAVA各种加密与解密方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、凯撒加密

在密码学中,凯撒加密是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

public class caesarCipher {
    public static void main(String[] args) {
        String show = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~~";
        int key = 3;
        String ciphertext = encryption(show, key, true);
        System.out.println(ciphertext);

        String showText = encryption(ciphertext, key, false);
        System.out.println(showText);
    }

    /**
     * @param text 明文/密文
     * @param key  位移
     * @param mode 加密/解密  true/false
     * @return 密文/明文
     */
    private static String encryption(String text, int key, boolean mode) {
        char[] chars = text.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (char aChar : chars) {
            int a = mode ? aChar + key : aChar - key;
            char newa = (char) a;
            sb.append(newa);
        }
        return sb.toString();
    }
}

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ~~

密文字母表:DEFGHIJKLMNOPQRSTUVWXYZ[\]

注意:当字符的ASCII码  +  偏移量  >  127,密文转化出来会乱码,~(波浪号):126+3=129

二、Base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

 base64 :  A-Z  a-z   0-9  +  /

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.nio.charset.StandardCharsets;


public class base64Demo {
    public static void main(String[] args) throws Base64DecodingException {
        //MQ==   一个字节补两个=
        System.out.println(Base64.encode("1".getBytes(StandardCharsets.UTF_8)));
        //MTE=   两个字节补一个=
        System.out.println(Base64.encode("11".getBytes(StandardCharsets.UTF_8)));
        //MTEx
        System.out.println(Base64.encode("111".getBytes(StandardCharsets.UTF_8)));
        //解密11
        System.out.println(new String(Base64.decode("MTE=")));
    }

}

三、信息摘要算法(MD5 或 SHA)

信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。

import com.alibaba.fastjson.JSON;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;

//信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
public class DigestDemo {

    /**
     * @param input     明文
     * @param algorithm 算法  MD5 | sha-1 SHA-256 |
     * @return 密文  Base64 & Hex
     */
    private static String toHexOrBase64(String input, String algorithm) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance(algorithm);
        byte[] digest1 = digest.digest(input.getBytes(StandardCharsets.UTF_8));
        String base64 = Base64.encode(digest1);
        StringBuffer haxValue = new StringBuffer();
        for (byte b : digest1) {
            //0xff是16进制数,这个刚好8位都是1的二进制数,而且转成int类型的时候,高位会补0
            int val = ((int) b) & 0xff;//只取得低八位
            //在&正数byte值的话,对数值不会有改变 在&负数数byte值的话,对数值前面补位的1会变成0,
            if (val < 16) {
                haxValue.append("0");//位数不够,高位补0
            }
            haxValue.append(Integer.toHexString(val));
        }
        HashMap<String, String> DigestMap = new HashMap<>();
        DigestMap.put("Base64", base64);
        DigestMap.put("Hex", String.valueOf(haxValue));
        return JSON.toJSONString(DigestMap);
    }
}

加密原文:123456

算法 Base64
MD5
4QrcOUm6Wau+VuBX8g+IPg==
sha-1
fEqNCco3Yq9h5ZUglD3CZJT4lBs=
sha-256
jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=
算法 Hex
MD5 e10adc3949ba59abbe56e057f20f883e
sha-1 7c4a8d09ca3762af61e59520943dc26494f8941b
sha-256 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

四、对称加密(Des,Triple Des,AES)

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。常用的单向加密算法:

  • DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
  • 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
  • AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256位密钥的加密;

加密原文:你好世界!!

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;


public class desOrAesDemo {
    public static void main(String[] args) throws Exception {
        String text = "你好世界!!";

        String key = "12345678";//des必须8字节
        // 算法/模式/填充  默认 DES/ECB/PKCS5Padding
        String transformation = "DES";

        String key1 = "1234567812345678";//aes必须16字节
        String transformation1 = "AES";

        String key2 = "123456781234567812345678";//TripleDES使用24字节的key
        String transformation2 = "TripleDes";

        String extracted = extracted(text, key, transformation, true);
        System.out.println("DES加密:" + extracted);
        String extracted1 = extracted(extracted, key, transformation, false);
        System.out.println("解密:" + extracted1);


        String extracted2 = extracted(text, key1, transformation1, true);
        System.out.println("AES加密:" + extracted2);
        String extracted3 = extracted(extracted2, key1, transformation1, false);
        System.out.println("解密:" + extracted3);

        String extracted4 = extracted(text, key2, transformation2, true);
        System.out.println("Triple Des加密:" + extracted4);
        String extracted5 = extracted(extracted, key2, transformation2, false);
        System.out.println("解密:" + extracted5);
    }

    /**
     * @param text           明文/base64密文
     * @param key            密钥
     * @param transformation 转换方式
     * @param mode           加密/解密
     */
    private static String extracted(String text, String key, String transformation, boolean mode) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        Cipher cipher = Cipher.getInstance(transformation);
        //    key          与给定的密钥内容相关联的密钥算法的名称
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), transformation);
        //Cipher 的操作模式,加密模式:ENCRYPT_MODE、 解密模式:DECRYPT_MODE、包装模式:WRAP_MODE 或 解包装:UNWRAP_MODE)
        cipher.init(mode ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKeySpec);
        byte[] bytes = cipher.doFinal(mode ? text.getBytes(StandardCharsets.UTF_8) : Base64.decode(text));
        return mode ? Base64.encode(bytes) : new String(bytes);
    }


}
算法 密匙 密文
DES
12345678     8位
j+tPzTH7ttEeK+FrJaLY8OwmOezdN8hF
AES
12345678*2   16位
/+cq03JhyvrTIJyYvWwc2Dc/bFUBNKelKPSANnWgsAw=
TripleDes
12345678*3       24位 j+tPzTH7ttEeK+FrJaLY8OwmOezdN8hF

五、非对称加密

公钥加密,也叫非对称(密钥)加密(public key encryption),属于通信科技下的网络安全二级学科,指的是由对应的一对唯一性密钥(即公开密钥和私有密钥)组成的加密方法。它解决了密钥的发布和管理问题,是商业密码的核心。在公钥加密体制中,没有公开的是私钥,公开的是公钥。常用的算法:

RSA、ElGamal、背包算法、Rabin(Rabin的加密法可以说是RSA方法的特例)、Diffie-Hellman (D-H) 密钥交换协议中的公钥加密算法、Elliptic Curve Cryptography(ECC,椭圆曲线加密算法)。

1.生成公钥和私钥文件

目前JDK1.8支持 RSA、DSA、DIFFIEHELLMAN、EC

/**
 * 生成公钥和私钥文件
 * @param algorithm   算法
 * @param privatePath 私钥路径
 * @param publicPath  公钥路径
 */    
private static void generateKeyFile(String algorithm, String privatePath, String publicPath) throws NoSuchAlgorithmException, IOException {
        //返回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        //生成一个密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //私钥
        PrivateKey privateKey = keyPair.getPrivate();
        //公钥
        PublicKey publicKey = keyPair.getPublic();

        byte[] privateKeyEncoded = privateKey.getEncoded();
        byte[] publicKeyEncoded = publicKey.getEncoded();

        String privateEncodeString = Base64.encode(privateKeyEncoded);
        String publicEncodeString = Base64.encode(publicKeyEncoded);
        //需导入commons-io
        FileUtils.writeStringToFile(new File(privatePath), privateEncodeString, StandardCharsets.UTF_8);
        FileUtils.writeStringToFile(new File(publicPath), publicEncodeString, StandardCharsets.UTF_8);
}

2.使用RSA进行加密、解密

package cryptography;

import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.apache.commons.io.FileUtils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSADemo {
    public static void main(String[] args) throws Exception {
       
        String text = "===你好世界===";
        String algorithm = "RSA";

        PublicKey publicKey = getPublicKey(algorithm, "rsaKey/publicKey2.txt");
        PrivateKey privateKey = getPrivateKey(algorithm, "rsaKey/privateKey2.txt");
        
        String s = RSAEncrypt(text, algorithm, publicKey);
        String s1 = RSADecrypt(s, algorithm, privateKey);

        System.out.println(s);
        System.out.println(s1);
        
        //generateKeyFile("DSA","D:\\privateKey2.txt","D:\\publicKey2.txt");

    }

    /**
     * 获取公钥,key
     * @param algorithm  算法
     * @param publicPath 密匙文件路径
     * @return
     */
    private static PublicKey getPublicKey(String algorithm, String publicPath) throws IOException, NoSuchAlgorithmException, Base64DecodingException, InvalidKeySpecException {
        String publicEncodeString = FileUtils.readFileToString(new File(publicPath), StandardCharsets.UTF_8);
        //返回转换指定算法的 public/private 关键字的 KeyFactory 对象。
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        //此类表示根据 ASN.1 类型 SubjectPublicKeyInfo 进行编码的公用密钥的 ASN.1 编码
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(publicEncodeString));
        return keyFactory.generatePublic(x509EncodedKeySpec);
    }

    /**
     * 获取私钥,key
     * @param algorithm   算法
     * @param privatePath 密匙文件路径
     * @return
     */
    private static PrivateKey getPrivateKey(String algorithm, String privatePath) throws IOException, NoSuchAlgorithmException, Base64DecodingException, InvalidKeySpecException {
        String privateEncodeString = FileUtils.readFileToString(new File(privatePath), StandardCharsets.UTF_8);
        //返回转换指定算法的 public/private 关键字的 KeyFactory 对象。
        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
        //创建私钥key的规则  此类表示按照 ASN.1 类型 PrivateKeyInfo 进行编码的专用密钥的 ASN.1 编码
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(privateEncodeString));
        //私钥对象
        return keyFactory.generatePrivate(pkcs8EncodedKeySpec);
    }

    /**
     * 加密
     * @param text      明文
     * @param algorithm 算法
     * @param key       私钥/密钥
     * @return 密文
     */
    private static String RSAEncrypt(String text, String algorithm, Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] bytes = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));
        return Base64.encode(bytes);
    }

    /**
     * 解密
     * @param extracted 密文
     * @param algorithm 算法
     * @param key       密钥/私钥
     * @return String 明文
     */
    private static String RSADecrypt(String extracted, String algorithm, Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, Base64DecodingException, NoSuchProviderException {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] bytes1 = cipher.doFinal(Base64.decode(extracted));
        return new String(bytes1);
    }

    /**
     * 生成公钥和私钥文件
     * @param algorithm   算法
     * @param privatePath 私钥路径
     * @param publicPath  公钥路径
     */
    private static void generateKeyFile(String algorithm, String privatePath, String publicPath) throws NoSuchAlgorithmException, IOException {
        //返回生成指定算法的 public/private 密钥对的 KeyPairGenerator 对象
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
        //生成一个密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        //私钥
        PrivateKey privateKey = keyPair.getPrivate();
        //公钥
        PublicKey publicKey = keyPair.getPublic();

        byte[] privateKeyEncoded = privateKey.getEncoded();
        byte[] publicKeyEncoded = publicKey.getEncoded();

        String privateEncodeString = Base64.encode(privateKeyEncoded);
        String publicEncodeString = Base64.encode(publicKeyEncoded);
        //需导入commons-io
        FileUtils.writeStringToFile(new File(privatePath), privateEncodeString, StandardCharsets.UTF_8);
        FileUtils.writeStringToFile(new File(publicPath), publicEncodeString, StandardCharsets.UTF_8);
    }
}

密文(明文:===你好世界===)  

ZBadyYCIck2iYV8RtsY35T1GbaYt9aLS51dcws5H4IcrOH+i6/8AIEdgtwJO3p1ccqKP6XTwQAWm
ceJ7kpsk76nvFD8Hg2pLYzH2oEE+oy07bLBdBiE+zVFkP+0DL+nrsHO4elQxc9BSslj5wGLQqbb1
Mxh9Tcpf5zJEOxdBZvE= 

六、查看系统支持的算法

public static void main(String[] args) throws Exception {
        System.out.println("列出加密服务提供者:");
        Provider[] pro=Security.getProviders();
        for(Provider p:pro){
            System.out.println("Provider:"+p.getName()+" - version:"+p.getVersion());
            System.out.println(p.getInfo());
        }
        System.out.println("=======");

        System.out.println("列出系统支持的消息摘要算法:");
        for(String s:Security.getAlgorithms("MessageDigest")){
            System.out.println(s);
        }
        System.out.println("=======");

        System.out.println("列出系统支持的生成公钥和私钥对的算法:");
        for(String s:Security.getAlgorithms("KeyPairGenerator")){
            System.out.println(s);
        }
}

其他加密算法可以使用 Bouncy Castle Crypto包文章来源地址https://www.toymoban.com/news/detail-533189.html

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>

到了这里,关于JAVA各种加密与解密方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java:AES加密和解密

    1 前言 对称加密,即单秘钥加密,指加密和解密的过程中,使用相同的秘钥,相比于非对称加密,因仅有一把钥匙,故而速度更快,更适合解密大文件(常见于如视频文件的加密解密中)。AES算法就属于对称加密中的一种。 2 使用 依赖引入: AES加密与解密的工具类封装: 执

    2024年02月11日
    浏览(59)
  • Java常用的加密解密工具类

    在软件开发中,数据的安全性是一个重要的考虑因素。为了保护敏感数据,我们经常需要对数据进行加密和解密操作。为了简化加密解密操作,提高开发效率,我们可以使用一个常用的加密解密工具类。本文将介绍一个常用的 Java 加密解密工具类,并提供详细的使用说明和示

    2024年02月02日
    浏览(47)
  • Java SM4加密解密

    2024年02月11日
    浏览(67)
  • java和js实现前端加密后端解密,后端加密前端解密(Base64)

    目录 1.前端加密后端解密 2.后端加密前端解密 在前端和后端数据传输时,常常涉及到隐私数据的传输(例如用户名和密码),这时,我们就需要对隐私数据进行加密解密 1.前端加密后端解密         1.1 前端jquery实现         1.2后端 2.后端加密前端解密         2.1后端加密

    2024年02月16日
    浏览(59)
  • Java加解密(四)非对称加密

    非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 也称公开密钥加密

    2024年02月10日
    浏览(47)
  • Java的Base64加密解密详解

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在当今数字化时代,数据的安全性和可传递性变得尤为重要。Java编程语言提供了 Base64 编码和解码的工具,成为保障数据传输和存储安全性的一项重要技术

    2024年04月15日
    浏览(60)
  • Java:如何加密或解密PDF文档?

    在工作中,我们会将重要的文档进行加密,并且设置用户的访问权限,其他外部人员均无法打开,只有获取该权限的用户才有资格打开文档。此外,限制用户的使用权限,极大程度上阻止了那些有意要篡改、拷贝其中内容的人,提高文档的安全性。与此同时,文档加密的另一

    2023年04月13日
    浏览(40)
  • Java实现字符串加密与解密

    我们在设计登录程序时需要用到保存用户名和密码的功能,如果是直接写入到txt文件中保存很容易被木马程序识破,所以就必须先对密码加密,只留存密文。 今天介绍的是使用 十六进 制转换的方式加密数据。 得到结果: 757376662d312d6d7064626d697074752d323534342d717974646b 现在我们将

    2024年02月11日
    浏览(51)
  • .net中加解密用BouncyCastle就够了,支持常用的各种加密解密算法

    BouncyCastle 是一个流行的 Java 加解密库,也支持在 .NET 平台上使用。下面是 BouncyCastle 在 .NET 下使用的一些常见功能,包括 AES、RSA、MD5、SHA1、DES、SHA256、SHA384、SHA512 等。 在开始之前,请确保你已经将 BouncyCastle 的 NuGet 包安装到你的项目中。你可以通过 NuGet 包管理器控制台或

    2024年02月05日
    浏览(54)
  • Java 实现 AES 加密和解密完整示例

    AES,全称为 Advanced Encryption Standard,是一种分组密码算法,用于保护敏感数据的传输和存储。AES 分为 128 位和 256 位两种密钥长度,可以对数据进行加密和解密,保证数据的安全性和完整性。AES 主要应用于电子商务、移动支付、网络安全等领域,被广泛运用于现代社会的各个

    2024年02月04日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包