美文网首页算法
[ 加密 ] AES好是好 密钥长度却是固定 但我想任意位数可否

[ 加密 ] AES好是好 密钥长度却是固定 但我想任意位数可否

作者: 一个好汉 | 来源:发表于2021-09-04 09:57 被阅读0次
用户想打架篇

用户输入的口令并不能直接作为AES的密钥进行加密
用户当场暴跳如雷...
比特长度恰好是128/192/256位或者说16/24/32字节
这可如何是好呀

再加上用户输入的口令一般都有规律,
安全性远远不如安全随机数产生的随机口令
极其容易被破解

用户输入的口令,通常还需要使用PBE算法,采用随机数杂凑计算出真正的密钥,再进行加密

来人 上代码
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;

/**
 * 口令加密
 * 记得引入 BouncyCastle jar包
 */
public class PBEEncrypt {
    public static void main(String[] args) throws Exception {
        // 把BouncyCastle作为Provider添加到java.security:
        Security.addProvider(new BouncyCastleProvider());
        // 原文:
        String message = "Hello, world!";
        // 加密口令:
        String password = "hello12345";
        // 16 bytes随机Salt:
        byte[] salt = SecureRandom.getInstanceStrong().generateSeed(16);
        System.out.printf("salt: %032x\n", new BigInteger(1, salt));
        // 加密:
        byte[] data = message.getBytes(StandardCharsets.UTF_8);
        byte[] encrypted = encrypt(password, salt, data);
        System.out.println("encrypted: " + Base64.getEncoder().encodeToString(encrypted));
        // 解密:
        byte[] decrypted = decrypt(password, salt, encrypted);
        System.out.println("decrypted: " + new String(decrypted, StandardCharsets.UTF_8));
    }

    /**
     * 加密
     */
    public static byte[] encrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {
        // 通过 SecretKeyFactory 获取Key
        PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
        SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");
        SecretKey skey = skeyFactory.generateSecret(keySpec);
        // 通过加盐 获取 AlgorithmParameterSpec 指定了循环次数1000,循环次数越多 暴力破解难度越大
        PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);
        // Cipher 初始化
        Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");
        cipher.init(Cipher.ENCRYPT_MODE, skey, pbeps);
        // 加密 搞定
        return cipher.doFinal(input);
    }

    // 解密:
    public static byte[] decrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {
        PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());
        SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");
        SecretKey skey = skeyFactory.generateSecret(keySpec);
        PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);
        Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");
        cipher.init(Cipher.DECRYPT_MODE, skey, pbeps);
        return cipher.doFinal(input);
    }
}

来人 上结果
salt: ee160bd84def30cbbd5feb04b60b7e41
encrypted: 5S8RWNzBLXRcUOiKB6e2vA==
decrypted: Hello, world!
来人 上结论

PBEwithSHA1and128bitAES-CBC-BC 算法通过用户口令和安全的随机salt计算出Key,然后底层使用AES再进行加密

Key通过口令和安全的随机salt计算得出,大大提高了安全性

相关文章

  • [ 加密 ] AES好是好 密钥长度却是固定 但我想任意位数可否

    用户想打架篇 用户输入的口令并不能直接作为AES的密钥进行加密用户当场暴跳如雷...比特长度恰好是128/192/...

  • Python加密解密-AES

    AES是对称加密,同一个密钥同时用来加密和解密. AES加密数据块分组长度必须为128比特,密钥长度可以是128比...

  • 对称加密三:分组加密常见分组模式

    3.分组密码的模式 前面介绍的DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文...

  • iOS 加、解密

    对称密钥加密 对称加密相对好理解,加密方和解密方使用的是同一个密钥。常见的对称密钥加密有AES、DES 等。 MD...

  • AES加密算法

    AES为对称加密算法。将明文按每组128位进行分组加密,并交由密钥进行多轮加密。AES的key支持三种长度:aes...

  • 加密算法在 iOS 上的应用

    常用加密算法 对称加密算法:AES、DES 加密和解密使用同一密钥。 加密速度快 密钥管理困难,任意泄密 非对称加...

  • AES 并不等于Rijndael

    AES 并不等于Rijndael。 php 实现AES 加密解密 AES 的定义: AES的区块长度固定为128比...

  • AES接口加密

    项目里有些时候需要用AES来进行接口加密,密钥分为固定密钥和动态密钥,一般固定密钥写死在app内,将登录的信息用固...

  • 对称加密算法-简单密钥之五

    1. 背景 细心的读者会发现,前面介绍的对称加密算法中,密钥的长度是固定位数的,但现实一般输入密码时都是一些长度不...

  • 加密

    AES 加密 密钥生成 数据填充至16的倍数 AES 加密 BASE64 加密 解密 BASE64 解密 AES ...

网友评论

    本文标题:[ 加密 ] AES好是好 密钥长度却是固定 但我想任意位数可否

    本文链接:https://www.haomeiwen.com/subject/urklwltx.html