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),用以加密你网上交易的重要信息。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 思科下一代模拟器EVE-NG安装

    思科下一代模拟器EVE-NG安装思科模拟器最早10年前接触过CiscoPacketTracer,后来发展的GNS3,不过一直只支持思科的设备,而EVE最近几年开始火了起来,不仅支持思科设备,而且支持众多的华为,山石等国产设备。EVE-NG官网:https://www.eve-ng.net/EVE-NG官网下载页:Download下载其中的社区版OVA和window客户端即可官方的下载连接如下社区版的OVF文件https://mega.nz/file/qlt3zK7Q#LZdFhSxJPCpd4-QNyu5U6ia

  • 网易云音乐ncm格式如何转换为mp3_ncm文件转换mp3

    网易云音乐ncm格式如何转换为mp3_ncm文件转换mp3ncm格式就是网易云音乐会员身份下载的格式,套路和腾讯一样,会员过期了都听不了,需要你保持一直是会员;此篇文章是给大家安利的是一个在线批量转换ncm格式转为mp3的网站,使用起来非常简单。link:http://ncm.worthsee.com/1.准备好网易云ncm格式音频2.选择音乐,点击开始(shift多选)3.下载全部4….

  • 一文搞懂JVM内存结构

    一文搞懂JVM内存结构1.前言Java虚拟机是中、高级开发人员必须修炼的知识,有着较高的学习门槛,很多人都不情愿去接触它。可能是觉得学习成本较高又或者是感觉没什么实用性,所以干脆懒得“搭理”它了。其实这种想法是错误的。举个最简单的例子,JVM基本上是每家招聘公司都会问到的问题,它们会这么无聊问这些不切实际的问题吗?很显然不是。由JVM引发的故障问题,无论在我们开发过程中还是生产环境下都是非常常见的。比如…

  • CSDN各产品线月度NPS分析报告新鲜出炉【2021年7月】[通俗易懂]

    CSDN各产品线月度NPS分析报告新鲜出炉【2021年7月】[通俗易懂]不知道各位用户大大有没有注意到,最近,咱们CSDN网站很多页面增加了这个功能模块:你愿意向朋友推荐xxx吗?哈哈,聪明的小伙伴们可能已经知道了,它其实就是个简单的满意度调查,学名NPS。那到底什么是NPS呢?且听C菌我慢慢道来。一、什么是NPS?NPS是针对企业良性收益与真实增长所提出的用户忠诚度概念,它是目前最流行的顾客忠诚度分析指标。根据用户的推荐意愿,将用户分为三类:推荐者、被动者、贬损者,推荐者与贬损者是对企业实际的产品口碑有影响的用户,这两部分用户在用户总数中所占百分比之差,就是.

  • 门户网站开发[通俗易懂]

    门户网站开发[通俗易懂]最近正在考虑开发一个门户网站。领导要求比较急,所以有的东西就得暂停一下了。关键是我个人也想早点做出来,做出来了有中成就感,感觉好极了。开发计划步骤:1.需求分析。在这个时候领导还是打算网站外包出去的,采取资源互换形式,即不花钱那种,我就开始认真的写需求,尽可能的详细精确,因为我也开发过网站,对于一个开发者来说一个好的需求是非常非常重要的。但是人家想让我们出一部分钱,领导不愿意了

  • 按位异或解题技巧「建议收藏」

    按位异或解题技巧「建议收藏」按位异或可以解决类似开灯问题一类的问题。首先了解下什么是按位异或:异或运算:首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1相同则为0.该方法被广泛推广用来统计一个数的1的位数!参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。即:  0^0=0,  1^0=1,  0^1=1,  1^1=0按位异或的3个特点:…

发表回复

您的电子邮箱地址不会被公开。

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