美文网首页
Rijndael自定义加密块大小192bit

Rijndael自定义加密块大小192bit

作者: gigglesoso | 来源:发表于2020-09-09 18:26 被阅读0次

    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,不能设置。

    相关文章

      网友评论

          本文标题:Rijndael自定义加密块大小192bit

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