首页 > 其他分享 >AES加密 & RSA签名

AES加密 & RSA签名

时间:2024-09-14 17:13:59浏览次数:8  
标签:AES 加密 String getInstance Base64 RSA System new byte

public class Main {
    public static void main(String[] args) throws Exception {
        // 生成RSA密钥对
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(1024);
        KeyPair keyPair = keyGen.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // 将公钥和私钥转换为Base64编码的字符串
        String rsaPublicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
        String rsaPrivateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
        // 对称加密算法
        String algorithm = "AES";

        // AES密钥(长度通常为128、192或256位)
        KeyGenerator aesKeyFactor = KeyGenerator.getInstance(algorithm);
        aesKeyFactor.init(128); // 128-bit AES key
        byte[] aesKey = aesKeyFactor.generateKey().getEncoded();
//        String key = "1234567812345678"; // 16字节*8 = 128位

        // 敏感信息
        String content = "{\"dog_name\":\"小.王\",\"dogGender\":\"male\"}";
        String timestamp = String.valueOf(System.currentTimeMillis());
        // 拼接时间戳
        content = timestamp + "|" + content;

        System.out.println("\n-----------发送方-----------\n");

        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        SecretKeySpec keySpec = new SecretKeySpec(aesKey, algorithm);
        // 随机初始化向量iv,以实现相同content加密后的密文是不同的
        byte[] iv = new byte[12];
        SecureRandom random = new SecureRandom();
        random.nextBytes(iv);
        String ivStr = Base64.getEncoder().encodeToString(iv);
        GCMParameterSpec gcmSpec = new GCMParameterSpec(128, iv);
        // 加密模式
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, gcmSpec);
        byte[] encryptBytes = cipher.doFinal(content.getBytes());
        String encryptText = Base64.getEncoder().encodeToString(encryptBytes);


        // RSA私钥签名
        PrivateKey rsaPrivateKey = recoverPrivateKey(rsaPrivateKeyStr);
        Signature signer = Signature.getInstance("SHA256withRSA");
        signer.initSign(rsaPrivateKey);
        // 获取SHA-256 MessageDigest实例
        MessageDigest digest = MessageDigest.getInstance("SHA-256");

        // 对密文进行哈希处理
        byte[] hashBytes = digest.digest(encryptText.getBytes());
        signer.update(hashBytes); // 对密文的哈希值进行签名(而非对密文本身签名),以此避免得到过长的签名结果
        byte[] signatureBytes = signer.sign();
        String signature = Base64.getEncoder().encodeToString(signatureBytes);

        // 输出结果
        System.out.println("Encrypted Text: " + encryptText);
        System.out.println("Signature: " + signature);
        System.out.println("ivStr: " + ivStr);

        System.out.println("\n-----------接收方-----------\n");

        // 验签
        PublicKey rsaPublicKey = recoverPublicKey(rsaPublicKeyStr);
        Signature verifier = Signature.getInstance("SHA256withRSA");
        verifier.initVerify(rsaPublicKey);
        verifier.update(hashBytes);
        boolean isCorrect = verifier.verify(Base64.getDecoder().decode(signature));
        if (isCorrect) {
            System.out.println("验签成功");
        } else {
            System.out.println("验签失败");
        }

        // 解密
        Cipher recieverCipher = Cipher.getInstance("AES/GCM/NoPadding");
        SecretKeySpec receiverSk = new SecretKeySpec(aesKey, algorithm);
        byte[] receiverIv = Base64.getDecoder().decode(ivStr);
        GCMParameterSpec gcm = new GCMParameterSpec(128, receiverIv);
        // 解密模式
        recieverCipher.init(Cipher.DECRYPT_MODE, receiverSk, gcm);
        // 先将加密后的字符串解码回字节数据
        byte[] decodedBytes = Base64.getDecoder().decode(encryptText);
        byte[] plainBytes = recieverCipher.doFinal(decodedBytes);
        String plainText = new String(plainBytes).split("\\|")[1]; // 原文
        System.out.println(plainText);
    }

    private static PublicKey recoverPublicKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePublic(keySpec);
    }

    private static PrivateKey recoverPrivateKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return keyFactory.generatePrivate(keySpec);
    }
}

 

标签:AES,加密,String,getInstance,Base64,RSA,System,new,byte
From: https://www.cnblogs.com/ashet/p/18414377

相关文章

  • 图纸加密软件哪个最好用?七款顶级图纸加密软件大比拼! (2024年图纸设计行业必备)
    在图纸行业,每一份设计图纸都承载着企业的核心竞争力与智慧结晶。图纸一旦泄露,不仅可能导致知识产权的丧失,还可能影响企业的市场竞争力和品牌形象。因此,选择一款高效、可靠的图纸加密软件,对于图纸行业的企业而言,无疑是保护核心资产、确保业务连续性的必备之选。接下来,我们将......
  • The 3rd Universal Cup. Stage 7: Warsaw 补题
    A太牛了。复读jiangly题解。先把代价除以二。设\(f_{i,j}\)表示以\(j\)的代价覆盖前\(i\)个点最多还能覆盖多少距离。发现只有\(f_{i,x},f_{i,x+1},f_{i,x+2}\)的值是有意义的。其中\(x\)为覆盖的最小代价。因为\(f_{i,x+3}\)一定不优。不如你到下个点再买一张......
  • 2024年图纸加密软件最新版排行榜出炉!10款图纸加密软件大比拼
    随着企业和个人对信息安全的关注日益增加,图纸加密软件成为了保护机密数据的重要工具。无论是工程设计公司、建筑公司,还是制造业,都需要确保图纸文件的安全性,防止未经授权的访问和泄漏。2024年,一系列全新功能和技术的图纸加密软件登上了排行榜。本文将为您详细介绍排名前十的图......
  • 10款功能强大的电脑加密软件排行榜!企业文件加密软件推荐
    在当今数字化时代,数据安全已成为企业运营的重中之重。无论是个人用户还是企业用户,都需要确保其重要文件和数据的安全性。电脑加密软件作为一种有效的数据保护工具,能够帮助用户加密敏感信息,防止数据泄露和未经授权的访问。1.安秉网盾这是一款专门为满足企业需求设计的加密软......
  • 企业源代码怎么加密防泄密?2024十款好用的源代码加密软件
    在当今数字化和信息化的时代,企业的源代码通常承载了核心技术和商业机密,若被泄露或窃取,可能导致企业遭受不可估量的损失。为防止源代码泄密,企业需要采取多层次的安全措施,其中源代码加密是最关键的一环。1.安秉源代码加密安秉源代码加密软件是一款适用于Windows和Linux平台的......
  • 四个方法,加密文件\文件夹
    在数字化时代,数据安全已成为企业和个人不可忽视的重要议题。加密作为保护敏感信息免受未授权访问的有效手段,其重要性日益凸显。本文将深入探讨加密文件与文件夹的四大高效方法,帮助大家构建更加坚固的数据防护屏障。方法一:首先,有很多文件都是自带加密方式的,比如pdf、word、exc......
  • c#和java通用sm4加密
    c#安装BouncyCastle  SM4工具类usingSystem.Text;usingOrg.BouncyCastle.Utilities.Encoders;namespaceStrongOA.Core.Utils{///<summary>///SM4工具类///</summary>publicclassSM4Util{publicstaticstringsecr......
  • SHA加密算法
    SHA简介安全散列算法(英语:SecureHashAlgorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。  目前SHA有五个算法,分别是SHA-1、SHA-......
  • MD5加密算法
    MD5简介MD5算法是单向散列算法的一种。单向散列算法也称为HASH算法,是一种将任意长度的信息压缩至某一固定长度(称之为消息摘要)的函数(该压缩过程不可逆)。在MD5算法中,这个摘要是指将任意数据映射成一个128位长的摘要信息。并且其是不可逆的,即从摘要信息无法反向推演中原文,在演算过......
  • 加密与安全_优雅存储用户密码的最佳实践
    文章目录Pre概述最佳实践避免使用MD5、SHA1等快速哈希算法加盐哈希(不推荐)使用BCrypt、Argon2等慢哈希算法(推荐)BCryptCode1.自动生成和嵌入盐2.哈希结果的格式3.代价因子BCrypt特点防止暴力破解1.登录失败锁定2.双因素认证(2FA)3.图形验证码或短信验证4.异常......