`
阅读更多

每条记录使用单独的秘钥,通过AES CBC算法进行加密。

使用统一的派生密钥,使用每条记录的ID号作为派生密钥的信息进行密钥派生。

得到派生密钥之后,就可以使用AES算法进行密钥派生。

3. 使用方法

1. 派生密钥

	byte[] key=deriveAesKey("123");
派生完的密钥在byte数组key中。
2. 加密
	byte[] encryptedData = aesCbcEncrypt(key, "Hello".getBytes() );
使用上面的密钥进行加密。“Hello”是要加密的内容。返回值为byte数组,为加密后的内容。可以转码后进行保存(进数据库)。
3. 解密
	byte[] decryptedData = aesCbcDecrypt(key, encryptedData);
解密完的数据为byte数组。请根据需要进行转码。例如:new String(decryptedData)。

4. 限制

需要对JDK进行JCE Unlimited Policy补丁(可以从Oracle网站下载)。

 

5. 附录:相关代码

 

 

加密函数
    final static int AES_KEY_LENGTH = 32;
    // 864273525a44818245d9c4910c8c9ab7
    final static byte[] saltConst = {(byte)0x86,(byte)0x42,(byte)0x73,(byte)0x52,(byte)0x5A,(byte)0x44,(byte)0x81,(byte)0x82,
                                     (byte)0x45,(byte)0xD9,(byte)0xC4,(byte)0x91,(byte)0x0C,(byte)0x8C,(byte)0x9A,(byte)0xB7};
    // 82ef6e6ecfe49e4084355995e42293ec
    final static byte[] ivConst =   {(byte)0x82,(byte)0xEF,(byte)0x6E,(byte)0x6E,(byte)0xCF,(byte)0xE4,(byte)0x9E,(byte)0x40,
                                     (byte)0x84,(byte)0x35,(byte)0x59,(byte)0x95,(byte)0xE4,(byte)0x22,(byte)0x93,(byte)0xEC};
    final static IvParameterSpec ivConstParams=new IvParameterSpec(ivConst);
     
    public static byte[] deriveAesKey(String password) {
        int iterations = 3;
        char[] chars = password.toCharArray();
        byte[] salt = saltConst;
         
        byte[] hash = null;
        PBEKeySpec spec = new PBEKeySpec(chars, salt, iterations, AES_KEY_LENGTH * 8);
        SecretKeyFactory skf;
        try {
            skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            hash = skf.generateSecret(spec).getEncoded();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
        return hash;
    }
     
    public static byte[] aesCbcEncrypt(byte[] key, byte[] source) {
        try {
            Cipher cipher;
            SecretKeySpec skeySpec = new SecretKeySpec(key, 0, key.length, "AES");
            cipher = Cipher.getInstance(AES_CBC);
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivConstParams);
           // cipher.update(source, 0, source.length);
            byte[] out = cipher.doFinal(source, 0, source.length);
            return out;
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        return null;
    }
     
    public static byte[] aesCbcDecrypt(byte[] key, byte[] source) {
        try {
            Cipher cipher;
            SecretKeySpec skeySpec = new SecretKeySpec(key, 0, key.length, "AES");
            cipher = Cipher.getInstance(AES_CBC);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivConstParams);
        
            byte[] out = cipher.doFinal(source, 0, source.length);
            return out;
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        return null;
    }
     
    public static void main(String args[]){
//      System.out.println( md5("123") );
//      System.out.println( sha("123") );
        System.out.println(byte2hex(deriveAesKey("123")));
        System.out.println(byte2hex(deriveAesKey("1234")));
        byte[] key=deriveAesKey("123");
        byte[] encryptedData = aesCbcEncrypt(key, "Hello".getBytes() );
        System.out.println(byte2hex(encryptedData));
        byte[] decryptedData = aesCbcDecrypt(key, encryptedData);
        System.out.println(new String(decryptedData));
    }
分享到:
评论

相关推荐

    基于区块链的公钥可搜索加密方案.pdf

    "基于区块链的公钥可搜索加密方案" 本文介绍了一种基于区块链的公钥可搜索加密方案,以解决公钥加密方案的陷门安全问题。该方案引入了随机数构造陷门与索引,用于抵御来自服务器内部的关键字猜测攻击,避免因服务器...

    P2P通信加密方案设计

    ### P2P通信加密方案设计知识点详解 #### 一、背景介绍 在当前网络环境中,点对点(Peer-to-Peer,简称P2P)通信技术因其高效、去中心化的特点而被广泛应用。然而,随着网络安全威胁的日益增多,如何确保P2P通信的...

    区块链上支持多关键字检索的可搜索加密方案.pdf

    区块链上支持多关键字检索的可搜索加密方案 本文档主要介绍了一种基于区块链技术的多关键字可搜索加密方案,该方案旨在解决云存储中单关键字检索的限制和云服务器不诚实搜索的问题。下面是该方案的详细介绍: 首先...

    对一种神经网络加密方案的安全性分析.pdf

    《对一种神经网络加密方案的安全性分析》这篇文章深入探讨了神经网络加密方案的脆弱性和安全性问题,特别是针对曹进德和虞文武教授在2006年提出的基于时滞的混沌神经网络加密方法(YU-CAO方案)。该方案利用混沌理论...

    基于区块链的多关键字细粒度可搜索加密方案.pdf

    基于区块链的多关键字细粒度可搜索加密方案,是一种创新的加密技术方案,主要针对现有方案中一些存在的问题提出改进。当前的密文策略下基于属性的关键字搜索(CP-ABKS)技术,虽然能实现加密数据的细粒度控制和检索...

    云环境下基于属性策略隐藏的可搜索加密方案.docx

    ### 云环境下基于属性策略隐藏的可搜索加密方案 #### 概述 随着云计算技术的飞速发展,越来越多的企业和个人倾向于将数据存储于云端,以享受便捷的数据管理和处理服务。然而,这种做法也引发了对数据隐私保护的关注...

    可搜索加密方案设计

    可搜索加密方案设计 本文是一个关于云存储中可搜索加密方案的研究与设计的硕士研究生毕业论文。该论文的主要目的是设计和实现一个基于关键字索引的可搜索加密技术,以满足云存储服务器对加密数据的检索需求。 可...

    飞天诚信ROCKEYARM加密方案

    ROCKEYARM是飞天诚信生产的加密狗,飞天诚信加密狗有20多年经验。ROCKEY-ARM系列产品全部采用了最先进的32位ARM芯片的高强度智能...附件提供了ROCKEYARM安全认证的加密方案,提高软件加密的安全性,有效防止软硬破解。

    明文嵌入式ECC加密方案_明文嵌入式ECC加密方案_ECC嵌入式加密_

    在明文嵌入式ECC加密方案中,我们通常会涉及到以下几个核心知识点: 1. **椭圆曲线理论基础**:ECC的基础是数学中的椭圆曲线理论,它涉及到代数几何和数论。在椭圆曲线上,我们可以定义一种加法操作,这为构建加密...

    一个数据传输加密方案的设计与实现

    ### 数据传输加密方案的设计与实现 #### 摘要与背景 本文介绍了一种数据传输加密方案的设计与实现,该方案旨在通过加密交易数据包来提高数据信息的保密性,并利用MAC(消息认证码)校验确保数据包的真实性和完整性...

    rasp矩阵代理加密方案

    "rasp矩阵代理加密方案"是一种先进的数据保护技术,尤其适用于云存储服务。该方案旨在确保用户在上传数据到服务器时,数据能以密文形式存在,即使在服务器端也无法直接解析,从而增强了数据的隐私性和安全性。在这个...

    基于Excel的数据加密方案

    "基于Excel的数据加密方案" 本文总结了几种基于Excel的数据加密方案,并对它们的原理和使用方法进行了详细说明。然后,对各种加密方案的安全性能进行了对比分析,为用户在保护Excel敏感数据方面提供了一些借鉴...

    原始ECC加密方案_原始ECC加密方案_ECC方案_baser1k_

    **原始ECC加密方案** 原始ECC(椭圆曲线加密)是一种基于数学难题的公钥密码学技术,相比传统的RSA等算法,它在安全性相当的情况下提供了更高效的密钥尺寸。ECC的核心在于椭圆曲线上的点群操作,这些操作与传统加密...

    论文研究-基于身份的单向多用的代理重加密方案.pdf

    针对大多单向多用的代理重加密方案存在密文大小、计算代价会随着重加密的次数增多而增加的问题,在Toshihiko的代理重加密方案的基础上,构造了一个基于身份的单向多用的代理重加密方案。相比已有的基于身份的代理重...

Global site tag (gtag.js) - Google Analytics