Rijndael自定义加密块大小192bit

2020-09-09  本文已影响0人  gigglesoso

AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB

综合以上可知,在加密数据时,加密数据块的大小Rijndael是可以选择的,而AES区块固定长度为128bit。

最近正好项目中有需求,需要把一个数据加密,加密后的数据有长度要求,192bit位的加密块成为我们的选择,因此尝试使用Rijndael进行加密,自己规定加密块大小。

加密方法如下:

    public static String encryptWithAesCBC(String plaintext, String key, String iv) {
        try {
            PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RijndaelEngine(192)), new ZeroBytePadding());
            CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key.getBytes()), iv.getBytes());
            cipher.init(true, ivAndKey);
            return new String(Base64.encode(cipherData(cipher, plaintext.getBytes())));
        } catch (InvalidCipherTextException e) {
            throw new RuntimeException(e);
        }
    }

    public static String decryptWithAesCBC(String encrypted, String key, String iv) {
        try {
            byte[] cipherText = Base64.decode(encrypted);
            PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(new RijndaelEngine(192)), new ZeroBytePadding());
            CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key.getBytes()), iv.getBytes());
            aes.init(false, ivAndKey);
            return new String(cipherData(aes, cipherText));
        } catch (InvalidCipherTextException e) {
            throw new RuntimeException(e);
        }
    }

   private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) throws InvalidCipherTextException {
        int minSize = cipher.getOutputSize(data.length);
        byte[] outBuf = new byte[minSize];
        int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
        int length2 = cipher.doFinal(outBuf, length1);
        int actualLength = length1 + length2;
        byte[] cipherArray = new byte[actualLength];
        for (int x = 0; x < actualLength; x++) {
            cipherArray[x] = outBuf[x];
        }
        return cipherArray;
    }

pom依赖:

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

bouncycastle 是一种用于 Java 平台的开放源码的轻量级密码术包;它支持大量的密码术算法,其中就包含了我们需要使用的AES的自定义加密块大小的功能。直接使用java标准类库中的AES加密算法,加密块只能是128bit,不能设置。

上一篇下一篇

猜你喜欢

热点阅读