`

Java加解密的基础

阅读更多

在Java的安全包中,包括了三部分内容:

1、JCA/JCE(Java Cryptography Architecture & JavaCryptography Extensions)
2、JSSE( Java Secure-Sockets Extension)
3、JAAS( Java Authentication & AuhorizationService)

在这里,将仅介绍加解密的实现。

Java 中的加解密的实现,是由JCA(Java Cryptography Architecture) 和JCE(Java Cryptography Extension)共同组成。 在JDK1.4之前,相关的包需要单独下载和安装。现在,Java加密扩展(JCE)已经成为Java SDK 1.4的核心组成部分。JCE是一组提供了加密框架并实现了一些加密,密钥生成算法和协议,消息认证码(MAC)等算法的Java包。

什么是Provider?
  JCA/JCE并不执行各种算法,它们只是连接应用和实际算法实现程序的一组接口。软件开发商根据JCE接口,将各种算法实现后,打包成一个Provider,可以动态地加到Java运行环境中。由于美国出口控制规定,JCA是可出口的(JCA和一个Sun的默认实现包括在Java2中),但是JCE对部分国家是限制出口的。因此,要实现一个完整的安全结构,就需要一个或多个第三方厂商提供的JCE产品,称为安全提供者(Provider)。
Provider是特定加密算法的实现者,有的供应商提供的加密技术是免费的,有的不免费。这些厂商有IBM,Bouncy Castle和RSA。Sun也给出了实现自己的Provider时需要遵循一些约定。

 在低版本JDK上JCE的安装
1.静态安装

    在安装和使用JCE之前,你需要从 Sun Web site(这里是以暗中sun的提供者为例)获得安装包。JCE中已经办函Sun自己的安全Provider - SunJCE,为了把SunJCE静态的安装到默认的Provider列表中,你需要修改安全属性文件:
•    <java-home>\jre\lib\security\java.security (Win32) 
•    <java-home>/jre/lib/security/java.security (UNIX)
假如你把JDK安装在C:\jdk1.3,你需要编辑以下文件:
C:\jdk1.3\jre\lib\security\java.security 
为了安装SunJCE,你需要在以上文件中加入:
security.provider.n=com.sun.crypto.provider.SunJCE
把n用你加入的提供者的优先级代替(注意:序号要保持递增,不能跳过,但可以调整前后顺序)。
代码A,用于查看你安装过的提供者的信息,结果在显示清单B中列出,显示Provider的能力,比如说可用的加密算法。
代码A: ProviderInformation.java
import java.security.Provider;
import java.security.Security;
import java.util.Set;
import java.util.Iterator;
public class ProviderInformation {
    public static void main(String[] args) {
        Provider[] providers = Security.getProviders();
        for (int i = 0; i < providers.length; i++) {
            Provider provider = providers[i];
            System.out.println("Provider name: " + provider.getName());
            System.out.println("Provider information: " + provider.getInfo());
            System.out.println("Provider version: " + provider.getVersion());
            Set entries = provider.entrySet();
            Iterator iterator = entries.iterator();
           while (iterator.hasNext()) {
                System.out.println("Property entry: " + iterator.next());
            }
        }
    }
}
显示清单B:
ProviderInformation.java output
Provider name: SUN
Provider information: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore)
Provider version: 1.2
Property entry: Alg.Alias.KeyFactory.1.2.840.10040.4.1=DSA
Property entry: Alg.Alias.Signature.1.2.840.10040.4.3=SHA1withDSA
Property entry: Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1=DSA
Property entry: Signature.SHA1withDSA KeySize=1024
Property entry: Signature.SHA1withDSA ImplementedIn=Software

动态安装:
代码C说明了如何在运行时动态加载Provider,要注意的是,当你用Security.addProvider(…)加载Provider时,它是对整个JVM环境都可用的。
代码C: DynamicProvider.java
import java.security.Security;
public class DynamicProvider {
    public static void main(String[] args) {
        // This is all there is to it!
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
    }
}
    如前所述,当你安装一个Provider时,你用n来指明此提供者的优先级,但一个算法的实例被调用时,JVM将按照提供的优先级来在已经安装的提供者中查找可用的实现,并使用他首先找到的可用算法。你也可用在调用时加上附加参数来指明要在哪个提供者中寻找使用的算法。

实现细节:
JCE API包含了大量的为实现安全特性的类和接口,首先,我们做一个DES对称(Symmetric)加密的例子。

生成密钥:
下面的代码展示了如何使用密钥生成器来生成密钥。
代码D: DESKeyGenerator.java
 
import javax.crypto.KeyGenerator;
import java.security.Key;
import java.security.NoSUChAlgorithmException;
import java.security.Security;
public class DESKeyGenerator {
    public static void main(String[] args) {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        try {
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            Key key = kg.generateKey();
            System.out.println("Key format: " + key.getFormat());
            System.out.println("Key algorithm: " + key.getAlgorithm());
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}
为了生成密钥,首先要初始化密钥生成器,这一步可以通过调用KeyGenerator类的静态方法getInstance来实现。所用的DES算法没有模式和填充模型。你同样可以(在getInstance(""))传入DES/ECB/PKCS5Padding来指明模式(ECB)和填充模式(PKCS5Padding),也可以传入另外一个参数指明所用的Provider,不过这是可选的。在获得密钥生成器的实例后,通过调用其generateKey()方法,我们就可以获得一个密钥。
 
生成密码(Cipher):
生成Cipher的过程跟生成密钥类似,需要调用Cipher类的getInstance方法,参数要跟生成密钥时用的参数保持一致。
代码E说明了如果操作。
代码E: DESCipherGenerator.java
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
public class DESCipherGenerator {
    public static void main(String[] args) {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        try{
            Cipher cipher = Cipher.getInstance("DES");
            System.out.println("Cipher provider: " + cipher.getProvider());
            System.out.println("Cipher algorithm: " + cipher.getAlgorithm());
        }catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
    }
}
 
加解密数据
加密是对字节的,所以保密行比较高,当你准备好了密钥和Cipher时,你已经做好了加密的准备。要注意的是,同一个算法要用相同的密钥和密码(Cipher)。比如说,你不能用DESsede的密钥,用DES的密码。Cipher对象用同一个方法对数据进行加密和解密,所有你要首先初时化,让他知道你要干什么:
 
cipher.init(Cipher.ENCRYPT_MODE, key);
 
这就将初始化Cipher类,以准备好去加密数据。最简单的加密方法就是对传入的字节数组调用doFinal方法:
byte[] data = “Hello World!”.getBytes();
byte[] result = cipher.doFinal(data);
 
以下是详细的代码
代码F: DESCryptoTest.java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.BadPaddingException;
import java.security.Key;
import java.security.Security;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
public class DESCryptoTest {
    public static void main(String[] args) {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        try {
            KeyGenerator kg = KeyGenerator.getInstance("DES");
            Key key = kg.generateKey();
            Cipher cipher = Cipher.getInstance("DES");
            byte[] data = "Hello World!".getBytes();
           
            System.out.println("Original data : " + new String(data));
           
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(data);
           
            System.out.println("Encrypted data: " + new String(result));
           
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] original = cipher.doFinal(result);
           
            System.out.println("Decrypted data: " + new String(original));
        }catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }catch (InvalidKeyException e) {
            e.printStackTrace();
        }catch (IllegalStateException e) {
            e.printStackTrace();
        }catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }catch (BadPaddingException e) {
            e.printStackTrace();
        }
    }
}
 
总结
JCE是个功能强大的API,提供了众多的加密方法和其他安全相关的属性,在这里,已经讲解了怎样动态和静态安装JCE,并用DES对一段简单的信息进行了加密和解密。以上内容仅对对称(Symmetric)加密举例介绍,对于非对称及其他数字签名等,可参照Java的文档。 
分享到:
评论

相关推荐

    java实现的加解密程序,适合新手

    java用异或实现的加解密程序,适合新手,并且做了简单的图形化界面,点击第一个按钮选择文件,在第二个文本框里输入密码,最后点击开始加密

    Java 加密解密基础分类及模式归纳整理

    主要介绍了Java加密解密基础分类方法汇总的相关资料,需要的朋友可以参考下

    java与C++互通加解密

    本次项目由于服务器之间需要通信加密,java和c++,自己只懂java,因此和同事(c)在网上找了好几个都测试不行,我们修改了其中一个,已通过测试,上传的是最基础的,需要复杂化的可自行修改。为了以后方便他人,贡献...

    Java加密与解密的艺术.mobi

    若要构建安全坚固的Java企业级应用,不仅要深入了解每种算法的原理并将它们综合运用,而且还要悟透Java加密与解密技术的本质。全书包含3个部分,基础篇对Java企业级应用的安全知识、密码学核心知识、与Java加密相关...

    《Java加密与解密的艺术》源码

    若要构建安全坚固的Java企业级应用,不仅要深入了解每种算法的原理并将它们综合运用,而且还要悟透Java加密与解密技术的本质。全书包含3个部分,基础篇对Java企业级应用的安全知识、密码学核心知识、与Java加密相关...

    Java加密与解密的艺术配书源代码

    全书包含3个部分,基础篇对Java企业级应用的安全知识、密码学核心知识、与Java加密相关的API和通过权限文件加强系统安全方面的知识进行了全面的介绍;实践篇不仅对电子邮件传输算法、消息摘要算法、对称加密算法、...

    SM2加密解密java代码完整示例

    国产加密算法SM2加密解密java代码完整示例。里面有加密解密的示例,生成秘钥的示例,本人亲测有效。默认maven环境编译。若无maven环境,里面也上传了相关依赖jar包。

    Java加密与解密的艺术

    , 全书包含3个部分,基础篇对Java企业级应用的安全知识、密码学核心知识、与Java加密相关的API和通过权限文件加强系统安全方面的知识进行了全面的介绍;实践篇不仅对电子邮件传输算法、消息摘要算法、对称加密算法、...

    JAVA加密与解密的艺术 第2版 pdf part2

    《Java加密与解密的艺术(第2版)》由梁栋著,以Java中的加密API和加密算法为切入点,全面介绍了Java SE 7的特性,及其中与安全相关的各种API,详细讲解了各种流行的加密算法及其在实际中的应用,为Java开发工程师和...

    JAVA加密与解密的艺术 第2版 pdf part1

    《Java加密与解密的艺术(第2版)》由梁栋著,以Java中的加密API和加密算法为切入点,全面介绍了Java SE 7的特性,及其中与安全相关的各种API,详细讲解了各种流行的加密算法及其在实际中的应用,为Java开发工程师和...

    JAVA加密与解密的艺术--第2版.rar

    全书包含3个部分,基础篇对Java企业级应用的安全知识、密码学核心知识、与Java加密相关的API和通过权限文件加强系统安全方面的知识进行了全面的介绍;实践篇不仅对电子邮件传输算法、消息摘要算法、对称加密算法、非...

    php-des-aes加解密java的demo包

    php-des-aes加解密对接java时整理的java代码,部分路径改变,密钥等信息删除,基础加密代码未动,有兴趣的小伙伴可以学下看下。

    Delphi与JAVA互加解密AES算法

    本组代码采用标准AES算法(基础算法引用ElAES.pas,感谢作者),代码支持AES/ECB/PKCS5Padding、AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充,Delphi与JAVA互相加解密。

    java jasypt包PBEWithMD5AndDES算法加解密C#版

    Java 使用jasypt包辅助,实现密码加解密。本方法实现了C#版,适用于一方加密另一方解密的情况,根据默认配置改版,可在当前版本基础上自定义更改指定算法、hash迭代次数、salt生成方式等

    Java加密与解密的艺术 第二版(清晰+书签+完整版).pdf

    《Java加密与解密的艺术(第2版)》共12章,分为3个部分:基础篇(第1~4章)对Java企业级应用的安全知识、密码学核心知识、与Java加密相关的API和通过权限文件加强系统安全方面的知识进行了全面的介绍;实践篇(第5...

    java加解密艺术.pdf+部分源码

    java加解密艺术.pdf+部分源码。 图书目录  第一部分 基础篇 第4章 他山之石,可以攻玉 第二部分 实践篇   第6章 验证数据完整性—消息摘要算法   第三部分 综合应用篇 第10章 终极武器—数字证书   附录

    Vigenère密码加解密及破解的java代码

    本人由于作业缘故,编写了一份java版的Vigenère密码加解密及破解的代码,密文密钥需要从控制台输入,可以更改代码,改为对文件的读写操作更为方便。 Vigenère密码的破解,一定要建立在大量的密文基础上(密文一定...

    java文件加密解密课程设计.doc

    课程设计报告书 课程名称 面向对象程序设计 设计题目 文本文档的加密与解密 2013年 1 月 "1 设计时间 " "2013年1月14日-2013年1月18日 " "2 设计目的 " "面向对象程序设计是一门实践性很强的计算机专业基础课程。...

Global site tag (gtag.js) - Google Analytics