java jce_了解Java JCE的加密

java jce_了解Java JCE的加密阅读提示:Java密码扩展(TheJavaCryptographyExtension),是JDK1.4的一个重要部分,本文介绍JCE的安装和使用。首先演示如果安装配置JCE(静态安装),然后是如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。Java密码扩展(TheJavaCryptographyExtension),是JDK1.4…

大家好,又见面了,我是你们的朋友全栈君。

阅读提示:Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,本文介绍JCE的安装和使用。首先演示如果安装配置JCE(静态安装),然后是如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。

Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框架并实现了一些加密,密钥生成算法和协议,消息认证码等算法,这篇文章将想你介绍JCE的安装和使用。

值得注意的是,尽管JCE是JDK1.4的核心包的一部分,我们将首先用JDK1.2及高一点的版本向你演示一下如何安装配置JCE(静态安装)。稍后,将向你介绍如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。

提供者是什么?

提供者是特定加密算法的实现者,有的提供者(提供的加密技术)是免费的,有的不免费,IBM, Bouncy Castle, 和 RSA都是一些(加密)提供者.在本文的后面,我们将考察一下来自Bouncy Castle的RSA算法。Sun 也向大家说明了如果实现自己的提供者(需要符合jDK的一些约定)。

静态安装

在安装和使用JCE之前,你需要从 Sun Web site(这里是以暗中sun的提供者为例)。获得他的安装包,JCE有sun他自己的安全提供者-sunJCE,为了吧sunJCE静态的安装到默认的提供者列表中,你需要修改安全属性文件:

◆\jre\lib\security\java.security (Win32)

◆/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用你加入的提供者的优先级代替(注意:序号要保持递增,不能跳过,但可以调整前后顺序)。

Listing A 用于查看你安装过的提供者的信息,结果在Listing B中列出,显示提供者的能力,比如说可用的加密算法。

Listing 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());

}

}

}

}

Listing 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

动态安装:Listing c 说明了如何在运行时动态加载安全提供者,要注意的是,当你用Security.addProvider(…)加载提供者时,它是对整个JVM环境都有用的;

Listing 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());

}

}

如前所述,当你安装一个提供者时,你用n来指明此提供者的优先级,但一个算法的实例被调用时,JVM将按照提供的优先级来在已经安装的提供者中查找可用的实现,并使用他首先找到的可用算法。你也可用在调研时加上附加参数来指明要在那个提供者中寻找使用的算法。

实现细节:

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

生成密钥:

Listing D 展示了如果初时化密钥生成器来生成密钥;

Listing 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来实现。我们所用的vanilla DES算法没有模式和填充模型。你同样可以(在getInstance(“”))传入DES/ECB/PKCS5Padding来指明模式(ECB)和填充模式(PKCS5Padding);也可以传入另外一个参数指明所用的提供者,不过这是可选的;

KeyGenerator kg = KeyGenerator.getInstance(“DES”);

一旦我们有了特定的密钥生成对象,我们就可以用他得到密钥:

Key key = kg.generateKey();

生成密码:

生成密码的过程跟生成密钥类似,需要调用Cipher类的getInstance方法,参数要跟生成密钥时用的参数保持一致;

Cipher cipher = Cipher.getInstance(“DES”);

Listing E 说明了如果操作:

Listing 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();

}

}

}

加解密数据

加密是对字节的,所以保密行比较高,当你准备好了密钥和密码时,你已经做好了加密的准备,要注意的时,同一个算法要用相同的密钥和密码,比如说,你不能用DESsede的密钥,用DES的密码,密码对象用同一个方法对数据进行加密和解密,所有你要首先初时化,让他知道你要干什么:

cipher.init(Cipher.ENCRYPT_MODE, key);

这就将初始化Cipher类,以准备好加密数据,.最简单的加密方法及时对传入的字节数组调用doFinal方法:

byte[] data = “Hello World!”.getBytes();

byte[] result = cipher.doFinal(data);

Listing F 是详细的代码

Listing 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对一段简单的信息进行了加密和解密,在本系列的第二部分,我们将把本文的知识用到现实的应用中去,将告诉大家如果写一个跟Socket配合使用的包装类(Wrapper),用以加密你网上交易的重要信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148129.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 红帽linux忘记密码的时候

    红帽linux忘记密码的时候

    2021年8月28日
    78
  • mybatis配置文件位置

    mybatis配置文件位置目录配置文件在resource/mapper文件下项目结构配置文件在java/**/mapper/xml文件夹下项目结构配置总结配置文件在resource/mapper文件下优点:配置文件在resource文件夹下,类文件在Java文件夹下,结构清晰项目结构##配置1、properties文件#配置扫描mybatis.mapper-locations=classpath:mapper/**.xml2、启动类@MapperScan(value=”top.jiug.sa.mapp

    2025年6月29日
    3
  • vue遍历渲染数组「建议收藏」

    vue遍历渲染数组「建议收藏」<divv-for=”iteminuserAllInfo.adevarUserSkills”:key=”item.id”>{{item}}</div>v-for=”单个数据in数组”:key=“单个数据.主键”(主键唯一)不是对象无需主键

    2022年10月7日
    2
  • SpringBoot启动一下就停止了_win10安装boot运行失误

    SpringBoot启动一下就停止了_win10安装boot运行失误springboot启动失败原因:本文想做一个系统管理,在springboot下进行开发,但是提交代码时出现启动失败,上网搜索发现各种原因主要包括:1说@EnableAutoConfiguration注解没加.2说@SpringBootApplication注解没加3说springboot-中包含tomcat疑问,删除maven依赖,重新下载解决’4说spring-boot-starter-parent依赖冲突,删除一个即可5说启动类要和项目在同一级下

    2025年10月14日
    3
  • 【JAVA 课程设计 之 万年历】「建议收藏」

    距离2017年还有30多个小时~转眼间2016只剩一个尾巴了,大学生活也过了快一半了,自己却依旧那么笨手笨脚,不会的知识永远那么多,该看的书永远没机会去看,2017愿一切如昨天抽的签:远方不一定有诗,但有更好的自己~明天你好,请多关照~2017希望我的家人们,小伙伴们,以及所有帮助过我的朋友们都能健健康康,万事如意~Java课设远没有自己想的难,万年历,不用做显示面~也算2016JAVA的最后一

    2022年4月10日
    51
  • win10修改dns服务器地址,教你Win10如何更改首选DNS服务器地址

    win10修改dns服务器地址,教你Win10如何更改首选DNS服务器地址Win10首选DNS服务器地址DNS(DomainNameServer,域名服务器)是进行域名(domainname)和与之相对应的IP地址(IPaddress)转换的服务器,这是专业性的表述,简单来说就是如果DNS出现问题,就会导致电脑可以上QQ,但是不能够上网页的现象,当然了,不管是浏览器也好,还是第三方的安全工具都能针对DNS错误进行修复,但是如果想要自己修改DNS服务器地址的话,…

    2022年5月30日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号