`
王者之剑
  • 浏览: 196452 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

用Bouncy Castle实现AES-128-CBC加密解密

    博客分类:
  • java
阅读更多

Bouncy Castle Crypto APIs 是一个开源的轻量级Java 加密解密包,实现了JCE/JCA的provider,支持AES等多种加密解密算法。
详情请见主页:http://www.bouncycastle.org/java.html
本文的示例代码使用了http://www.bouncycastle.org/download/bcprov-jdk16-139.jar
1)使用JCE的AES-128-CBC加密解密

package com.albertsong.aes;

import java.security.Key;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

/**
 * @author Albert
 * @version 1.0
 * 
 */
public class AESWithJCE {

    /**
     * @param args
     */
    public static void main(String[] args) {
        byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
                0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };
        byte[] iv = { 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38,
                0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
        String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        System.out.println("Original content:");
        System.out.println(content);
        try {
            Security.addProvider(new BouncyCastleProvider());
            Key key = new SecretKeySpec(keybytes, "AES");
            Cipher in = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
            in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] enc = in.doFinal(content.getBytes());
            System.out.println("Encrypted Content:");
            System.out.println(new String(Hex.encode(enc)));
            
            Cipher out = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
            out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
            byte[] dec = out.doFinal(enc);
            System.out.println("Decrypted Content:");
            System.out.println(new String(dec));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}

 2)不使用JCE的AES-128-CBC加密解密,可以用于J2ME程序中。

package com.albertsong.aes;

import org.bouncycastle.crypto.BufferedBlockCipher;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.util.encoders.Hex;

/**
 * @author Albert
 * @version 1.0
 *
 */
public class AESWithoutJCE {

    /**
     * @param args
     */
    public static void main(String[] args) {
        byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
                0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };
        byte[] iv = { 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38,
                0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31 };
        String content ="TEST1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        System.out.println("Original content:");
        System.out.println(content);
        try {
            BufferedBlockCipher engine = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESFastEngine()));
            engine.init(true, new ParametersWithIV(new KeyParameter(keybytes),iv));
            byte[] enc = new byte[engine.getOutputSize(content.getBytes().length)];
            int size1 = engine.processBytes(content.getBytes(), 0, content.getBytes().length, enc, 0);
            int size2 = engine.doFinal(enc, size1);
            System.out.println("size2 ="+size2);
            byte[] encryptedContent =new byte[size1+size2];
            System.arraycopy(enc, 0, encryptedContent, 0, encryptedContent.length);
            System.out.println("Encrypted Content:");
            System.out.println(new String(Hex.encode(encryptedContent)));
            
            
            engine.init(false, new ParametersWithIV(new KeyParameter(keybytes),iv));
            byte[] dec = new byte[engine.getOutputSize(encryptedContent.length)];
            size1 = engine.processBytes(encryptedContent, 0, encryptedContent.length, dec, 0);
            size2 = engine.doFinal(dec, size1);
            System.out.println("size2 ="+size2);
            byte[] decryptedContent =new byte[size1+size2];
            System.arraycopy(dec, 0, decryptedContent, 0, decryptedContent.length);
            System.out.println("Decrypted Content:");
            System.out.println(new String(decryptedContent));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}
 
5
0
分享到:
评论
6 楼 王者之剑 2009-01-06  
fantaxy025025 写道

好!我用的是:bcprov-jdk15-133.jar难道不行吗?

你这个版本比我的旧,可能不支持AES/CBC/PKCS7Padding这个算法,也有可能在旧版中名字不一样,我没有用过旧版的不清楚。
5 楼 fantaxy025025 2009-01-06  
好!
我用的是:bcprov-jdk15-133.jar
难道不行吗?
4 楼 王者之剑 2009-01-04  
fantaxy025025 写道

java.security.NoSuchAlgorithmException: No such algorithm: AES/CBC/PKCS7Padding我对加密解密了解不多,执行的时候出现错误,请问这是为啥?

提示的意思是找不到对于的加密算法。
你下载的是
http://www.bouncycastle.org/download/bcprov-jdk16-139.jar
这个吗?
3 楼 fantaxy025025 2009-01-04  
java.security.NoSuchAlgorithmException: No such algorithm: AES/CBC/PKCS7Padding

我对加密解密了解不多,执行的时候出现错误,请问这是为啥?
2 楼 王者之剑 2008-08-05  
不太懂你的意思,什么样的加密算法每次加密以后都不一样的?
1 楼 nyzzr 2008-08-05  
王者之剑:你好,我想请问一下,既然是AES-128-CBC加密,那为什么每次加密的结果都一样呀!!!

相关推荐

    AES 资料 Bouncy Castle Crypto

    **使用Bouncy Castle实现AES-128-CBC加密解密** 1. **初始化**: 首先,需要创建一个KeyGenerator对象,指定加密算法(如AES)和密钥大小(128位)。 2. **生成密钥**: 使用KeyGenerator生成密钥对。 3. **初始化向量...

    C# 基于BouncyCastle.Crypto 1.8.10 实现国密算法,SM2,SM3,SM4(加签解签,加密解密)

    在本文中,我们将深入探讨如何在C#环境中利用BouncyCastle.Crypto库1.8.10版本实现中国的国家标准密码算法,包括SM2、SM3和SM4。这些算法在中国的网络安全和数据保护中扮演着关键角色,为本地化安全应用提供了强大的...

    AES256加密及解密

    AES256是一种高级加密标准(Advanced Encryption Standard),是目前广泛应用的数据加密算法,以其强大的安全性、效率和灵活性而闻名。该标准由NIST(美国国家标准...这些知识点对于理解并实现AES256加密解密至关重要。

    BouncyCastle.dll C#依赖工具,用作数据的加解密辅助类

    BouncyCastle.dll 是一个在C#环境中广泛使用的开源加密库,它为.NET Framework提供了一整套强大的加密功能。这个库是基于Bouncy Castle项目,这是一个跨平台的Java和.NET加密库,提供了各种加密算法、密码协议和PKI...

    bouncycastle 加密工具包

    - **加密与解密**:通过API调用,开发者可以方便地实现对明文数据的加密和解密,支持块加密模式(如ECB、CBC)和流加密模式。 - **签名与验证**:利用Bouncy Castle可以创建数字签名,确保数据的完整性和来源的真实...

    c# AES加密与解密,RSA加密与解密,BouncyCastle.Crypto加密与解密

    本文将深入探讨C#编程语言中AES(高级加密标准)、RSA( Rivest-Shamir-Adleman)以及BouncyCastle.Crypto库的加密与解密机制,特别关注它们在接口安全通信中的应用。 首先,我们来看AES加密。AES是一种对称加密...

    Java实现AES CBC PKCS7Padding加解密.docx

    总的来说,Java实现AES CBC PKCS7Padding加解密,需要依赖如BouncyCastle这样的第三方库来扩展Java的加密功能。通过编写自定义工具类,可以方便地进行加解密操作,但在实际使用中,还需要注意安全性、错误处理以及...

    AES-256加密.rar

    在实际开发中,使用开源库如Apache Commons Crypto、Bouncy Castle或Google的Tink可以帮助简化AES-256的实现,这些库通常提供了更完善的加密选项和错误处理机制。 总之,AES-256加密在Java开发中扮演着至关重要的...

    Springboot+PBEWITHHMACSHA512ANDAES-128配置文件密码加密

    4. **编写加密器**:实现`PropertySourceEncryptor`接口,用PBEWITHHMACSHA512ANDAES-128算法实现`encrypt()`和`decrypt()`方法。这将用于在运行时加密和解密配置文件中的敏感数据。 5. **使用@Value注解**:在你的...

    aes解密需要的BouncyCastleProvider

    以下是一个简单的示例代码片段,展示了如何在Java中使用BouncyCastle进行AES解密: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import java.security....

    高性能AES256对称加解密,兼容Java、IOS、Android,带注释和使用方法

    可以使用CCCrypt函数来执行AES256加密和解密,需要先用SecKeyGenerateSymmetric创建密钥。 3. **Android**: Android也有内置的javax.crypto支持,但API使用略有不同。与Java类似,使用Cipher和KeyGenerator,但...

    bouncycastle_jar.rar

    例如,使用Bouncy Castle可以创建一个简单的AES加密和解密工具: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; // 注册Bouncy Castle Provider Security.addProvider(new ...

    jec-bouncycastle.jar.rar

    在Java项目中使用Bouncy Castle,通常需要将`jec-bouncycastle.jar`添加到项目的类路径中。如果是Maven项目,可以在pom.xml文件中添加对应的依赖。对于非Maven项目,可以通过下载JAR文件并将其放入项目的lib目录下。...

    AES.zip_aes algorithm _aes java_aes-256_java aes_zip

    5. 应用于ZIP文件:在ZIP文件上应用AES加密,可能需要使用`java.util.zip`包中的`ZipOutputStream`和`ZipInputStream`,结合AES加密库(如Bouncy Castle)来创建和读取加密的ZIP文件。 压缩包内的文件"AES.java"很...

    AES(Advanced Encryption Standard,高级加密标准)是一种常见的对称加密算法

    - 使用`Cipher.getInstance`创建加密/解密对象,参数分别为“AES/CBC/PKCS7Padding”和“BC”(代表Bouncy Castle)。 - 调用`init`方法设置加密模式(`ENCRYPT_MODE`或`DECRYPT_MODE`),并传入密钥对象和初始化...

    java配置加密组件bouncy_castle

    Java配置加密组件Bouncy Castle是...无论是加密解密、数字签名,还是证书管理,Bouncy Castle都能提供可靠的支持。在实际项目中,根据具体需求选择合适的加密算法和配置,确保数据安全的同时,也要兼顾性能和合规性。

    AESGCM_Dll.zip

    BouncyCastle库在C#中通常通过CryptoAPI或Managed CryptoAPI来使用,为开发者提供了易于使用的API,用于实现加密和解密操作。 对于Unity游戏引擎,AES-GCM的使用可能涉及到在游戏中存储敏感数据,如用户账户信息或...

    vb6.0下AES加解密模块,可对字符和文件进行加解密

    这可能涉及到使用第三方库,如OpenSSL或Bouncy Castle的.NET版本,或者使用Microsoft的CryptoAPI。这些库提供了必要的加密函数,允许开发者在VB6.0代码中调用AES算法。 对于字符加解密,通常涉及字符串的处理。在VB...

    Java实现的AES256加密解密功能示例

    以下是对Java实现AES256加密解密功能的详细解析: 1. **密钥生成**: 在提供的代码中,`initkey()` 方法使用`KeyGenerator`类生成AES256密钥。`KeyGenerator.getInstance(KEY_ALGORITHM, "BC")`初始化一个密钥生成...

    bccrypto-csharp-1.8.8-bin.zip

    开发者可以使用BouncyCastle.Crypto.dll来实现加密、解密、签名、验签以及创建和管理证书链等功能。在.NET环境中,通过添加这个DLL作为引用,开发人员可以直接调用其提供的类和方法来实现各种复杂的密码学操作,从而...

Global site tag (gtag.js) - Google Analytics