Java中如何进行加密和数字签名

合集下载

java des加密方法

java des加密方法

java des加密方法
Java中的DES加密方法是一种对称加密算法,它使用一个共享的密钥来加密和解密数据。

DES算法的密钥长度为56位,但由于其已被认为容易被破解,因此现在已经不再被广泛使用。

在Java中,我们可以使用Java Cryptography Extension (JCE)中的javax.crypto包中的类来执行DES加密和解密操作。

我们可以使用javax.crypto.KeyGenerator类来生成一个DES密钥,然后使用javax.crypto.Cipher类来执行加密和解密操作。

使用DES加密和解密数据的基本流程如下:
1. 创建一个javax.crypto.KeyGenerator对象,并使用DES算法初始化它。

2. 调用KeyGenerator的generateKey()方法生成一个密钥。

3. 创建一个javax.crypto.Cipher对象,并使用密钥初始化它。

4. 调用Cipher的doFinal()方法,将需要加密或解密的数据作为参数传递给它。

5. 将加密或解密后的数据作为结果返回。

在进行DES加密和解密操作时,我们需要注意以下几点:
1. 密钥长度必须为8个字节,即56位。

2. 加密和解密的数据必须是8个字节的倍数,如果不足8个字节,则需要使用填充方法填充。

3. 加密和解密使用的密钥必须相同,否则解密将失败。

在实际应用中,我们可以使用DES加密算法来保护敏感数据的安
全性,例如密码、信用卡号码等。

同时,我们也需要采取其他措施来保护数据传输的安全,例如使用SSL/TLS协议。

java 密码加密解密方法

java 密码加密解密方法

java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。

其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。

一种常见的密码加密方法是使用MessageDigest类进行加密。

这可以通过以下步骤实现:首先,将密码转换为字节数组。

然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。

接下来,使用update方法将密码的字节数组传递给MessageDigest实例。

最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。

另一种常见的方法是使用对称加密算法,例如AES或DES。

这些算法使用相同的密钥进行加密和解密。

在Java中,可以使用javax.crypto包中的类来实现对称加密。

通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。

此外,还可以使用非对称加密算法,例如RSA。

这种方法使用公钥对数据进行加密,然后使用私钥进行解密。

在Java中,可以使用java.security包中的类来实现非对称加密。

无论使用哪种方法,都需要注意密码安全的问题。

例如,密钥的安全存储和管理,以及密码传输过程中的安全性。

另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。

总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。

希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。

java 加签方法

java 加签方法

java 加签方法Java加签方法Java加签是在数据传输过程中,为数据增加一段签名,以验证数据的完整性和真实性。

在Java中,可以通过使用MessageDigest类和PrivateKey类实现加签功能。

下面将介绍如何使用Java中的加签方法。

首先,我们需要获取要加签的数据。

假设我们有一个字符串类型的数据,如下所示:```javaString data = "Hello, World!";```接下来,我们需要准备私钥,私钥用于生成签名。

私钥可以由数字证书颁发机构(CA)或其他合法机构颁发。

假设我们已经有一个私钥文件 privateKey.pem,我们可以使用下面的代码读取私钥:```javaString privateKeyPath = "path/to/privateKey.pem";String privateKeyContent = newString(Files.readAllBytes(Paths.get(privateKeyPath)));```然后,我们需要将私钥转换为Java中的PrivateKey对象。

我们可以使用Java的密钥工厂(KeyFactory)类来实现转换:```javaString privateKeyType = "RSA";PKCS8EncodedKeySpec keySpec = newPKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyContent));PrivateKey privateKey =KeyFactory.getInstance(privateKeyType).generatePrivate(keySpec);```接下来,我们使用私钥对数据进行加签。

通常使用RSA算法进行签名。

我们可以使用Java的Signature类来实现加签功能:```javaString algorithm = "SHA256withRSA";Signature signature = Signature.getInstance(algorithm);signature.initSign(privateKey);signature.update(data.getBytes());byte[] sign = signature.sign();```现在,我们已经生成了加签后的数据。

java 签章流程

java 签章流程

Java签章流程介绍在现代数字化的时代,电子签名已经成为了一种普遍的方式来确认文件的真实性和完整性。

Java提供了丰富的API和工具来实现电子签名功能。

本文将详细介绍Java签章的流程和步骤,以确保流程清晰且实用。

签章流程Java签章的流程可以分为以下几个步骤:1.准备工作:在开始签章之前,需要准备一些必要的工作,包括获取证书、创建密钥库等。

2.加载证书:需要加载用于签章的证书。

证书是由认证机构(CA)颁发的,用于验证签名者身份和确保文件的完整性。

3.创建数字签名:使用私钥对文件进行加密生成数字签名。

私钥是与公钥配对使用的密钥,只有持有私钥的人才能对文件进行数字签名。

4.将数字签名附加到文件:将生成的数字签名附加到原始文件中。

这可以通过在文件中添加特定标记或在文件末尾添加附加信息来完成。

5.验证数字签名:接收者可以使用公钥来验证文件的数字签名是否有效。

公钥是与之前加载的证书相关联的密钥。

下面将详细介绍每个步骤。

准备工作在开始签章之前,需要进行一些准备工作。

1.获取证书:需要获取一个由认证机构颁发的证书。

可以通过向认证机构申请或购买来获得。

2.创建密钥库:密钥库是用于存储私钥和相关证书的安全文件。

可以使用Java提供的keytool工具来创建密钥库。

以下是创建密钥库的示例命令:keytool -genkeypair -alias mykey -keyalg RSA -keystore keystore.jks这将创建一个名为keystore.jks的密钥库,并生成一个RSA算法的密钥对。

3.导出证书:从生成的密钥库中导出公钥证书。

可以使用以下命令导出证书:keytool -exportcert -alias mykey -keystore keystore.jks -file certificate.crt这将从keystore.jks中导出名为certificate.crt的证书文件。

加载证书在准备工作完成后,可以加载用于签章的证书。

java md5加密算法的用法

java md5加密算法的用法

文章标题:深度解析Java中的MD5加密算法及其用法一、介绍在当今信息技术快速发展的时代,数据安全问题愈发凸显。

作为一种常用的加密算法,MD5(Message-Digest Algorithm 5)因其快速性和高安全性而受到广泛关注和应用。

本文将深度解析Java中的MD5加密算法及其用法,帮助读者更深入地理解和应用该加密算法。

二、MD5加密算法简介MD5是一种散列函数,其输出通常为128位的数据。

MD5算法以输入的消息为基础,通过一系列复杂的运算,生成一个128位的散列值作为加密后的结果。

MD5算法的特点是不可逆,即无法通过散列值逆向得到原始消息。

MD5算法常用于对密码、数字签名等敏感信息进行加密存储。

三、Java中的MD5加密算法实现在Java中,要使用MD5加密算法,通常需要借助java.security包下的MessageDigest类。

下面是一个简单的Java示例代码,演示了如何使用MD5加密算法对字符串进行加密:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Demo {public String encrypt(String input) {try {MessageDigest md =MessageDigest.getInstance("MD5");md.update(input.getBytes());byte[] digest = md.digest();StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff)); }return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}public static void main(String[] args) {MD5Demo demo = new MD5Demo();String input = "Hello, MD5";String encrypted = demo.encrypt(input);System.out.println("MD5加密后:" + encrypted);}}```四、MD5加密算法的应用场景MD5加密算法在实际应用中有着广泛的应用场景,以下是一些常见的应用场景:1. 密码加密:在用户注册、登录等情景中,可使用MD5加密算法对用户密码进行加密存储,确保用户信息的安全性。

JavaPHPRSA互通密钥、签名、验签、加密、解密

JavaPHPRSA互通密钥、签名、验签、加密、解密

JavaPHPRSA互通密钥、签名、验签、加密、解密RSA加密算法是⼀种⾮对称加密算法。

在公开密钥加密和电⼦商业中RSA被⼴泛使⽤。

RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)⼀起提出的。

当时他们三⼈都在⿇省理⼯学院⼯作。

RSA就是他们三⼈姓⽒开头字母拼在⼀起组成的。

RSA是第⼀个⽐较完善的公开密钥算法,它既能⽤于加密,也能⽤于数字签名。

这个算法经受住了多年深⼊的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有⼀定的可信性,⽬前它已经成为最流⾏的公开密钥算法。

RSA的安全基于⼤数分解的难度。

其公钥和私钥是⼀对⼤素数(100到200位⼗进制数或更⼤)的函数。

从⼀个公钥和密⽂恢复出明⽂的难度,等价于分解两个⼤素数之积(这是公认的数学难题)。

RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表:版本语⾔版本PHP7.3.11Java 1.8.0_231密钥⽣成PHPRSAUtils::resetGenKeyPairpublic static function resetGenKeyPair(){$config = array("private_key_bits" => self::PRIVATE_KEY_BITS,"private_key_type" => self::KEY_ALGORITHM,);$openssl = openssl_pkey_new($config);openssl_pkey_export($openssl, $privateKey);$publicKey = openssl_pkey_get_details($openssl);$publicKey = $publicKey["key"];return ['publicKey' => $publicKey,'privateKey' => $privateKey,'publicKeyStr' => self::key2str($publicKey),'privateKeyStr' => self::key2str($privateKey)];}JavaRSAUtils.resetGenKeyPairstatic Map<String, Object> resetGenKeyPair() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}签名私钥加签。

java中的md5用法

java中的md5用法

java中的md5用法Java中的MD5用法什么是MD5MD5是一种常见的哈希算法,用于对任意长度的数据进行加密。

它可以将任意长度的数据转化为定长的128位(16字节)哈希值。

使用场景MD5主要用于密码存储、数据完整性校验、数字签名等场景。

使用步骤1.导入类:import ;2.创建MD5对象:MessageDigest md = ("MD5");此处也可以使用其他哈希算法,如”SHA-1”等。

3.将要加密的数据转换为字节数组:String data = "Hello, World!";byte[] dataBytes = ();4.将字节数组更新到MD5对象中:(dataBytes);5.计算MD5的哈希值:byte[] md5Bytes = ();6.将MD5的哈希值转化为字符串表示:StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}String md5 = ();通过上述步骤,我们即可得到原始数据的MD5加密结果。

实际应用密码存储在用户注册或登录时,常常需要对用户输入的密码进行加密后才能进行存储或验证。

以下是一个示例代码:public static String getMD5(String data) {String md5 = null;try {MessageDigest md = ("MD5");byte[] dataBytes = ();(dataBytes);byte[] md5Bytes = ();StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}md5 = ();} catch (Exception e) {();}return md5;}在注册时,可以将用户输入的密码使用上述方法加密后存储到数据库中。

JAVA加密算法(DSA)

JAVA加密算法(DSA)

JAVA加密算法(DSA)Java中提供了多种加密算法,其中包括了DSA(Digital Signature Algorithm)数字签名算法。

DSA是一种非对称加密算法,用于数字签名的生成和验证。

下面将详细介绍Java中DSA加密算法的使用。

1.密钥对生成在Java中,可以使用`KeyPairGenerator`类生成DSA密钥对。

首先,需要指定生成密钥对的算法为DSA,然后使用`initialize(`方法设置密钥长度。

最后,通过调用`generateKeyPair(`方法生成密钥对。

```javaKeyPairGenerator kpg = KeyPairGenerator.getInstance("DSA");kpg.initialize(1024); // 设置密钥长度KeyPair keyPair = kpg.generateKeyPair(; // 生成密钥对```2.数字签名生成使用私钥对数据进行签名,可以保证数据的完整性和不可篡改性。

在Java中,可以使用`Signature`类进行数字签名的生成。

首先,需要指定签名算法为DSA,然后使用私钥初始化`Signature`对象。

接下来,使用`update(`方法更新要签名的数据,最后调用`sign(`方法生成签名数据。

```javaSignature signature = Signature.getInstance("DSA");signature.initSign(privateKey); // 使用私钥初始化signature.update(data); // 更新数据byte[] signatureData = signature.sign(; // 生成签名数据```3.数字签名验证使用公钥对签名进行验证,可以验证数据的完整性和真实性。

在Java中,可以使用`Signature`类进行数字签名的验证。

java 加签方法 -回复

java 加签方法 -回复

java 加签方法-回复Java加签方法,指的是在Java编程中进行数字签名的过程。

数字签名是在互联网通信中保证数据完整性、真实性和不可否认性的重要手段之一。

在网络传输中,数据可能会被篡改、伪造或篡改。

数字签名通过私钥对数据进行加密,然后通过公钥对加密后的数据进行解密和验证,以确保数据的完整性和真实性。

下面,我们将一步一步回答有关Java加签方法的问题。

1. 什么是数字签名?数字签名是将数据进行加密后,用私钥对加密后的数据进行签名,以确保数据在传输过程中的完整性、真实性和不可否认性。

数字签名可以用于验证数据的来源和完整性,防止数据被篡改或伪造。

2. 如何进行数字签名?在Java编程中,可以使用Java提供的密钥对生成器和数字签名算法来进行数字签名。

首先,需要生成一对密钥,包括公钥和私钥。

公钥用于对数据进行加密,私钥用于对加密后的数据进行解密和验证。

然后,使用私钥对数据进行加密并生成数字签名,将数据和数字签名一起传输。

接收方可以使用公钥对收到的数据进行解密和验证,以确保数据的完整性和真实性。

3. 如何在Java中生成密钥对?在Java中,可以使用Java密钥对生成器类(KeyPairGenerator)来生成密钥对。

首先,需要选择一个合适的算法,例如RSA或DSA。

然后,使用密钥对生成器类初始化并生成密钥对。

最后,可以使用公钥和私钥进行数字签名和验证操作。

4. 如何进行数字签名?在Java中,可以使用Java数字签名类(Signature)来进行数字签名。

首先,需要选择一个合适的数字签名算法,例如SHA1withRSA或SHA256withDSA。

然后,使用私钥初始化数字签名对象。

接着,使用update方法更新要签名的数据,可以多次调用update方法传入数据的不同部分。

最后,使用sign方法对数据进行签名,生成数字签名。

5. 如何验证数字签名?在Java中,可以使用Java数字签名类(Signature)来验证数字签名。

java 字符串加密解密常见方法

java 字符串加密解密常见方法

java 字符串加密解密常见方法在Java中,我们经常需要对字符串进行加密和解密操作以确保数据的安全性。

下面我将介绍一些常见的字符串加密和解密方法。

1. 使用Base64编码:Base64是一种常用的编码方式,它可以将任意二进制数据编码为纯文本字符串。

在Java中,可以借助Java提供的Base64类对字符串进行加密和解密操作。

例如:```javaimport java.util.Base64;public class Base64Util {// 字符串加密public static String encrypt(String str) {byte[] bytes = str.getBytes();byte[] encodedBytes = Base64.getEncoder().encode(bytes);return new String(encodedBytes);}// 字符串解密public static String decrypt(String str) {byte[] bytes = str.getBytes();byte[] decodedBytes = Base64.getDecoder().decode(bytes);return new String(decodedBytes);}}```2. 使用AES算法:AES(Advanced Encryption Standard)是一种对称加密算法,它可以对数据进行加密和解密。

在Java中,可以使用javax.crypto包提供的类来实现AES加密和解密。

例如:```javaimport javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUtil {// 生成AES密钥private static SecretKeySpec generateKey(String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] encodedKey = secretKey.getEncoded();return new SecretKeySpec(encodedKey, "AES");}// 字符串加密public static String encrypt(String str, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, generateKey(key));byte[] encryptedBytes = cipher.doFinal(str.getBytes());return new String(encryptedBytes);}// 字符串解密public static String decrypt(String str, String key) throws Exception {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, generateKey(key));byte[] decryptedBytes = cipher.doFinal(str.getBytes());return new String(decryptedBytes);}}```这是两种常见的字符串加密和解密方法。

java国密加密与解密流程

java国密加密与解密流程

java国密加密与解密流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 引入国密相关的依赖库在 Java 项目中,需要引入国密相关的依赖库,例如 Bouncy Castle 库。

java签名规则

java签名规则

java签名规则Java签名规则导语:Java签名规则是Java编程中一个非常重要的概念,它用于确保代码的安全性和完整性。

本文将介绍Java签名规则的概念、作用、格式以及常见应用场景。

一、概念Java签名是指对Java代码、类、方法等进行数字签名的过程。

数字签名是一种用于验证数据完整性和真实性的技术,它通过使用公钥和私钥对数据进行加密和解密,以确保数据在传输和存储过程中不被篡改。

二、作用Java签名规则的主要作用是确保代码的完整性和安全性。

通过对代码进行签名,可以防止代码被篡改或者恶意代码的注入。

此外,Java签名还可以用于验证代码的来源,以确保代码来自可信任的源。

三、格式Java签名规则的格式一般包括以下几个部分:1. 签名算法:用于确定签名的算法,常见的有MD5、SHA1、SHA256等。

2. 公钥:用于验证签名的公钥。

3. 签名数据:即被签名的数据,可以是Java代码、类文件或者jar包等。

4. 数字签名:用私钥对签名数据进行加密生成的签名。

四、常见应用场景1. 应用程序验证:在Java应用程序中,可以使用签名规则对应用进行验证,以确保应用的完整性和安全性。

2. JAR包验证:Java中的JAR包可以使用签名规则进行验证,以确保JAR包中的类文件未被篡改。

3. 数字证书验证:在Java中,数字证书常用于验证代码的来源和身份。

数字证书中包含了签名数据和签名,使用签名规则可以验证数字证书的完整性和真实性。

五、注意事项1. 使用强大的签名算法:在进行Java签名时,应选择安全性较高的签名算法,如SHA256。

2. 保护私钥的安全性:私钥是生成和验证签名的关键,应妥善保管,避免泄露。

3. 定期更新签名:为了保证安全性,应定期更新签名,尤其是在代码有更新或者发布新版本时。

4. 多层次签名:对于较大的项目,可以考虑使用多层次的签名验证,增加安全性。

六、总结本文介绍了Java签名规则的概念、作用、格式以及常见应用场景。

java 国密加签验签流程

java 国密加签验签流程

java 国密加签验签流程Java国密加签验签流程国密算法是我国自主研发的密码算法标准,具有高安全性和高效率的特点。

在Java中使用国密算法进行加签验签操作可以保障数据的安全性。

下面将介绍Java国密加签验签的流程。

一、加签流程1. 导入相关的类库在Java代码中,首先需要导入国密算法相关的类库。

可以使用Bouncy Castle库来实现国密算法的加签验签操作。

2. 初始化密钥使用国密算法进行加签验签操作时,首先需要初始化密钥。

可以通过KeyPairGenerator类生成密钥对,其中包括公钥和私钥。

3. 加载私钥在进行加签操作之前,需要加载私钥。

可以通过KeyFactory类的generatePrivate方法将密钥字节数组转换为私钥对象。

4. 创建签名对象使用Signature类创建签名对象,通过调用其getInstance方法并指定国密算法类型来创建签名对象。

在进行加签操作之前,需要初始化签名对象。

可以通过调用Signature类的initSign方法并传入私钥对象来初始化签名对象。

6. 更新数据对需要进行加签的数据进行更新。

可以通过Signature类的update方法传入数据字节数组来更新数据。

7. 签名使用Signature类的sign方法进行签名操作,将加签结果保存为字节数组。

二、验签流程1. 导入相关的类库同样需要导入国密算法相关的类库。

2. 加载公钥在进行验签操作之前,需要加载公钥。

可以通过KeyFactory类的generatePublic方法将公钥字节数组转换为公钥对象。

3. 创建签名对象使用Signature类创建签名对象,通过调用其getInstance方法并指定国密算法类型来创建签名对象。

在进行验签操作之前,需要初始化签名对象。

可以通过调用Signature类的initVerify方法并传入公钥对象来初始化签名对象。

5. 更新数据对需要进行验签的数据进行更新。

可以通过Signature类的update方法传入数据字节数组来更新数据。

Java-文件加密传输(摘要+签名)

Java-文件加密传输(摘要+签名)

Java-⽂件加密传输(摘要+签名)Java-⽂件加密传输(摘要+签名)⽂件加密传输其实就是将⽂件以⼆进制格式进⾏传输。

其中加密⽂件主要由:源⽂件⼆进制⽂件、源⽂件数字摘要、数字签名、特征码等等组成。

摘要可确认⽂件的唯⼀性,数字签名则是对摘要进⾏了加密。

本⽂主要记录使⽤RSA加密⽅式其中⽣成RSA密钥主要介绍⼆种⽅式:1、安装openssl情况下使⽤Linux命令⽣成2、Java代码实现⼀、公私钥⽣成1、linux1、查看openssl版本 openssl version -a2、⽣成私钥 openssl genrsa -out rsa_private_key.pem 2048 会⽣成rsa_private_key.pem私钥⽂件,私钥⽂件不能使⽤3、⽣成公钥 openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -puboutopenssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt 私钥⽂件不能使⽤4、私钥⽂件PKCS#8编码 openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem 此处⽣成的私钥⽂件⽅可⽤于Java2、Javaimport java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.security.InvalidKeyException;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import mons.codec.binary.Base64;public class RSAEncrypt {/*** 字节数据转字符串专⽤集合*/private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};private static final String PRIVATE_BEGIN = "-----BEGIN PRIVATE KEY-----";private static final String PRIVATE_END = "-----END PRIVATE KEY-----";private static final String PUBLIC_BEGIN = "-----BEGIN PUBLIC KEY-----";private static final String PUBLIC_END = "-----END PUBLIC KEY-----";/*** 1、随机⽣成密钥对** @param filePath 密钥存放⽬录*/public void genKeyPair(String filePath) {// KeyPairGenerator类⽤于⽣成公钥和私钥对,基于RSA算法⽣成对象KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 初始化密钥对⽣成器,密钥⼤⼩为96-1024位keyPairGen.initialize(1024, new SecureRandom());// ⽣成⼀个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();// 得到私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 得到公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();try {// 得到公钥字符串Base64 base64 = new Base64();String publicKeyString = new String(base64.encode(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(base64.encode(privateKey.getEncoded()));// 将密钥对写⼊到⽂件FileWriter pubfw = new FileWriter(filePath + "\\publicKey.pem");FileWriter prifw = new FileWriter(filePath + "\\privateKey.pem");BufferedWriter pubbw = new BufferedWriter(pubfw);BufferedWriter pribw = new BufferedWriter(prifw);pubbw.write(publicKeyString);pribw.write(privateKeyString);pubbw.flush();pubbw.close();pubfw.close();pribw.flush();pribw.close();prifw.close();} catch (Exception e) {e.printStackTrace();}}/*** 2、从本地⽂件中读取公钥** @param path 公钥路径* @return公钥字符串* @throws Exception 异常信息*/public String loadPublicKeyByFile(String path) throws Exception {try {BufferedReader br = new BufferedReader(new FileReader(path));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {// 去除公钥头部底部if (!readLine.equals(PUBLIC_BEGIN) && !readLine.equals(PUBLIC_END)) { sb.append(readLine);}}br.close();return sb.toString();} catch (IOException e) {throw new Exception("公钥数据流读取错误");} catch (NullPointerException e) {throw new Exception("公钥输⼊流为空");}}/*** 3、字符串公钥转公钥对象** @param publicKeyStr 公钥字符串类型* @return公钥对象* @throws Exception 异常信息*/public RSAPublicKey loadPublicKeyByStr(String publicKeyStr)throws Exception {try {Base64 base64 = new Base64();byte[] buffer = base64.decode(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return (RSAPublicKey) keyFactory.generatePublic(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("公钥⾮法");} catch (NullPointerException e) {throw new Exception("公钥数据为空");}}/*** 4、从本地⽂件中读取私钥** @param path 私钥⽂件路径* @return私钥字符串* @throws Exception 异常信息*/public String loadPrivateKeyByFile(String path) throws Exception {try {BufferedReader br = new BufferedReader(new FileReader(path));String readLine = null;StringBuilder sb = new StringBuilder();while ((readLine = br.readLine()) != null) {//去除私钥头部底部if (!readLine.equals(PRIVATE_BEGIN) && !readLine.equals(PRIVATE_END)) { sb.append(readLine);} else {}}br.close();return sb.toString();} catch (IOException e) {throw new Exception("私钥数据读取错误");} catch (NullPointerException e) {throw new Exception("私钥输⼊流为空");}}/*** 5、字符串公钥转公钥对象** @param privateKeyStr 私钥字符串类型* @return私钥对象* @throws Exception 异常信息*/public RSAPrivateKey loadPrivateKeyByStr(String privateKeyStr)throws Exception {try {Base64 base64 = new Base64();byte[] buffer = base64.decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance("RSA");return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("私钥⾮法");} catch (NullPointerException e) {throw new Exception("私钥数据为空");}}/*** 6、公钥加密过程** @param publicKey 公钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData)throws Exception {if (publicKey == null) {throw new Exception("加密公钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 7、私钥加密过程** @param privateKey 私钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPrivateKey privateKey, byte[] plainTextData) throws Exception {if (privateKey == null) {throw new Exception("加密私钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 8、私钥解密过程** @param privateKey 私钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {if (privateKey == null) {throw new Exception("解密私钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 9、公钥解密过程** @param publicKey 公钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPublicKey publicKey, byte[] cipherData)throws Exception {if (publicKey == null) {throw new Exception("解密公钥为空, 请设置");}Cipher cipher = null;try {// 使⽤默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 10、字节数据转⼗六进制字符串** @param data 输⼊数据* @return⼗六进制内容*/public String byteArrayToString(byte[] data) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < data.length; i++) {// 取出字节的⾼四位作为索引得到相应的⼗六进制标识符注意⽆符号右移stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);// 取出字节的低四位作为索引得到相应的⼗六进制标识符stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);if (i < data.length - 1) {stringBuilder.append(' ');}}return stringBuilder.toString();}}⼆、调⽤ /*** ⽣成加密后⽂件** @param oldFilePath 需要加密⽂件路径+名称* @param newFilePath 加密后⽂件路径+名称* @param privatePath 私钥⽂件路径+名称*/public void fileEncrypt(String oldFilePath, String newFilePath, String privatePath) {ByteUtil byteUtil = new ByteUtil();//⽂件格式:特征码+原始升级包长度+数字签名长度+原始包内容+数字签名byte[] code = byteUtil.intToByteArray(0x9F2308DC);RSAEncrypt rsaEncrypt = new RSAEncrypt();try {//1、特征码写⼊OutputStream out = new FileOutputStream(new File(newFilePath));out.write(code, 0, 4);//2、原始升级包长度写⼊byte[] fileByte = byteUtil.File2byte(oldFilePath);int L1 = fileByte.length;byte[] a = byteUtil.intToByteArray(L1);out.write(a, 0, 4);//⽂件摘要⽣成MsgDigestDemo msgDigestDemo = new MsgDigestDemo();MessageDigest md5Digest = MessageDigest.getInstance("MD5");md5Digest.update(msgDigestDemo.fileBytes(oldFilePath));byte[] md5Encoded = md5Digest.digest();("==========MD5摘要:{}==========", Base64.encodeBase64URLSafeString(md5Encoded)); String privateKey = rsaEncrypt.loadPrivateKeyByFile(privatePath);RSAPrivateKey privateKeyfile = rsaEncrypt.loadPrivateKeyByStr(privateKey);//⽣成签名(摘要加密过程)byte[] signature = rsaEncrypt.encrypt(privateKeyfile, md5Encoded);//3、签名长度int L2 = signature.length;byte[] c = byteUtil.intToByteArray(L2);out.write(c, 0, 4);//4、原始升级包内容写⼊out.write(fileByte, 0, L1);//5、数字签名写⼊out.write(signature, 0, L2);out.flush();out.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}MD5摘要计算public class MsgDigestDemo {public byte[] fileBytes(String filePath) {try {File file = new File(filePath);ByteArrayOutputStream out = new ByteArrayOutputStream(1024); FileInputStream in = new FileInputStream(file);byte[] fileByte = new byte[1024];int n;while ((n = in.read(fileByte)) != -1) {out.write(fileByte, 0, n);}in.close();byte[] data = out.toByteArray();out.close();return data;} catch (IOException e) {e.printStackTrace();}return null;}}。

javaSHA1WithRSA算法

javaSHA1WithRSA算法

javaSHA1WithRSA算法SHA1WithRSA是一种经典的数字签名算法,利用SHA1摘要算法和RSA非对称加密算法结合起来实现数字签名,保证数据的完整性和安全性。

下面将对该算法进行详细介绍和解析。

1.算法原理首先,SHA1WithRSA算法使用SHA1(Secure Hash Algorithm 1)算法对原始数据进行摘要计算,得到一个固定长度的摘要值,通常为160位(20字节),这个摘要值可以唯一的代表原始数据。

接下来,使用RSA加密算法对摘要值进行加密,生成一个数字签名。

RSA是一种非对称加密算法,使用公钥进行加密,使用私钥进行解密。

对于SHA1WithRSA算法而言,签名的过程是使用私钥对摘要值进行加密,生成签名;而验证的过程则是使用公钥对签名进行解密,还原原始的摘要值。

最后,接收到数字签名的一方,可以根据原始数据、公钥和数字签名,验证数字签名的真实性。

具体过程是首先使用相同的SHA1算法对原始数据进行摘要计算,得到一个新的摘要值,然后使用发送方的公钥对数字签名进行解密,还原原始的摘要值,并与新计算得到的摘要值进行比对,如果两个摘要值相同,则说明数字签名没有被篡改,数据可信。

2.实现过程实现SHA1WithRSA算法的关键是对原始数据进行摘要计算和RSA非对称加密。

2.1摘要计算摘要计算使用SHA1算法,将原始数据转化为一个固定长度的摘要值。

Java提供了MessageDigest类来实现SHA1算法的摘要计算。

```javaString originalData = "Hello, world!";MessageDigest sha1Digest = MessageDigest.getInstance("SHA1");byte[] sha1Hash = sha1Digest.digest(originalData.getBytes();```2.2RSA加密和解密RSA非对称加密算法使用公钥对数据进行加密,使用私钥对加密的数据进行解密。

java密码加密方法

java密码加密方法

java密码加密方法在现今的网络世界中,安全性是非常重要的一个问题,其中密码的安全性就尤为重要。

许多网站和应用程序都需要用户进行登录,需要输入用户名和密码来验证身份。

但是,用户往往习惯使用简单的密码,如生日、常用英文单词等。

这使得密码的安全性降低了很多,给黑客攻击、身份盗窃等带来了很大的风险。

为了提高密码安全性,需要对密码进行加密。

Java是一种非常流行的编程语言之一,有许多加密方法可以用来加密密码。

本文将介绍Java密码加密的几种方法。

1.MD5加密算法MD5是最常见的一种密码加密算法之一。

它可以将一个明文字符串加密成一个128位的哈希值,通常用32位的十六进制数字表示。

MD5被广泛使用,因为它是一个不可逆的算法,使用同样的密码加密出来的哈希值是唯一的,且不可反向推导出原始字符串。

以下是MD5加密的Java代码示例:```import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;StringBuffer sb = new StringBuffer();for (int i = 0; i < b.length; i++) {int v = b[i] & 0xFF;if (v < 16) {sb.append("0");}sb.append(Integer.toHexString(v));}return sb.toString();}在以上代码中,toMD5方法接受一个明文字符串,返回一个MD5哈希串,可以在一个数据库中保存。

在登陆时,将用户输入的密码进行MD5加密,然后和数据库中的加密串比较,若相等则表示输入的密码是正确的。

需要注意的是,MD5算法虽然被广泛使用,但是安全性并不是十分高,因为它在被攻击时容易被破解。

因此,在一些敏感性较高的场合下,建议使用更加复杂的加密算法,如SHA-1、SHA-256等。

java相关加密解密方法

java相关加密解密方法

java相关加密解密方法Java加密解密方法是保护数据安全的重要手段,本文将详细介绍几种常见的Java加密解密方法。

一、对称加密算法对称加密算法是一种使用相同的密钥进行加密和解密的算法。

这种加密方式简单高效,但存在密钥管理的问题,因为所有用户都必须知道密钥。

在Java中,常用的对称加密算法有DES、3DES、AES等。

1. DES:Data Encryption Standard,数据加密标准,是一种使用56位密钥的对称块密码算法。

在Java中,我们可以使用javax.crypto.Cipher类来实现DES 加密解密。

2. 3DES:Triple Data Encryption Algorithm,三重数据加密算法,是DES的增强版本,使用三个不同的56位密钥进行三次加密。

在Java中,我们同样可以使用Cipher类来实现3DES加密解密。

3. AES:Advanced Encryption Standard,高级加密标准,是一种使用128、192或256位密钥的对称块密码算法。

在Java中,我们可以使用Cipher类来实现AES加密解密。

二、非对称加密算法非对称加密算法是一种使用一对密钥(公钥和私钥)进行加密和解密的算法。

公钥可以公开给所有人,而私钥需要保密。

在Java中,常用的非对称加密算法有RSA、DSA等。

1. RSA:Rivest-Shamir-Adleman,一种基于大数因子分解难题的非对称加密算法。

在Java中,我们可以使用java.security.KeyPairGenerator类生成RSA密钥对,然后使用Cipher类进行RSA加密解密。

2. DSA:Digital Signature Algorithm,数字签名算法,是一种基于整数有限域离散对数难题的非对称加密算法。

在Java中,我们可以使用KeyPairGenerator类生成DSA密钥对,然后使用Signature类进行DSA签名和验证。

java hmacsha256 签名转原文

java hmacsha256 签名转原文

一、基本概念Java HMACSHA256签名是一种常用的加密算法,它可以对数据进行签名并进行验证,从而确保数据的完整性和安全性。

HMAC是“Hash-based Message Authentication Code”的缩写,SHA256是一种安全哈希算法,两者结合在一起可以用于生成数字签名。

二、算法原理HMACSHA256签名的原理是将原始数据通过SHA256算法进行哈希运算,然后使用一个密钥对哈希结果进行加密,最后生成签名。

在验证时,接收方可以通过相同的密钥和原始数据重新计算签名,然后与接收到的签名进行比对,从而判断数据的完整性和真实性。

三、Java实现在Java中,我们可以通过javax.crypto包中的相关类来实现HMACSHA256签名。

下面给出一个简单的示例代码:```javaimport javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;public class HMACSHA256 {public static String sign(String data, String key) {try {Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = newSecretKeySpec(key.getBytes(), "HmacSHA256");sha256_HMAC.init(secret_key);byte[] hash = sha256_HMAC.doFinal(data.getBytes()); return bytesToHex(hash);} catch (Exception e) {e.printStackTrace();return null;}}private static String bytesToHex(byte[] bytes) {StringBuilder result = new StringBuilder();for (byte b : bytes) {result.append(String.format("02x", b));}return result.toString();}}```四、调用示例使用上面的HMACSHA256类进行签名和验证很简单,下面是一个调用示例:```javapublic class M本人n {public static void m本人n(String[] args) {String data = "Hello, world!";String key = "mySecretKey";String signature = HMACSHA256.sign(data, key);System.out.println("Signature: " + signature);// 验证签名String newData = "Hello, world!";String newSignature = HMACSHA256.sign(newData, key); if (signature.equals(newSignature)) {System.out.println("Signature verified!");} else {System.out.println("Signature verification f本人led!"); }}}```五、安全性考虑在使用HMACSHA256签名时,需要注意以下几点以确保数据的安全性:1. 密钥的安全性:密钥是签名的关键,必须严格保管,避免泄露。

keytool加密原理

keytool加密原理

keytool加密原理
Keytool是Java开发工具包中的一个工具,用于管理密钥库和
证书。

它的加密原理涉及到公钥加密、数字签名和证书管理等方面。

首先,让我们来看公钥加密。

Keytool可以生成公钥和私钥对,并将它们存储在密钥库中。

公钥加密使用公钥对数据进行加密,只
有持有相应私钥的一方才能解密数据。

Keytool可以用来生成这样
的密钥对,并将公钥存储在证书中,以便其他方验证数据的真实性
和完整性。

其次,数字签名是Keytool的另一个重要功能。

数字签名是一
种用于验证数据完整性和真实性的技术,它使用私钥对数据进行签名,然后使用相应的公钥进行验证。

Keytool可以用来生成数字证书,并使用私钥对证书进行签名,然后将证书和相应的公钥存储在
密钥库中。

此外,Keytool还涉及证书管理。

证书是用于验证数据真实性
和完整性的一种方式,它包含公钥、数字签名和其他相关信息。

Keytool可以用来生成自签名证书、导入和导出证书、查看证书信
息等操作,从而实现证书的管理和应用。

综上所述,Keytool的加密原理涉及公钥加密、数字签名和证书管理等多个方面,它通过生成密钥对、签名证书和管理证书等操作来实现数据的加密和验证。

这些功能使得Keytool成为Java开发中重要的加密工具之一。

Java中常用的加密方式

Java中常用的加密方式

Java中常⽤的加密⽅式⼀、Java常⽤加密⽅式Base64加密算法(编码⽅式)MD5加密(消息摘要算法,验证信息完整性)对称加密算法⾮对称加密算法数字签名算法数字证书⼆、分类按加密算法是否需要key被分为两类:不基于key的有: Base64算法、MD5基于key的有: 对称加密算法、⾮对称加密算法、数字签名算法、数字证书、HMAC、RC4(对称加密)按加密算法是否可逆被分为两类:单向加密算法(不可解密):MD5、SHA、HMAC⾮单项加密算法(可解密):BASE64、对称加密算法、⾮对称加密算法、数字签名算法、数字证书三、算法介绍1.对称加密对称加密是最快速、最简单的⼀种加密⽅式,加密(encryption)与解密(decryption)⽤的是同样的密钥(secret key)。

对称加密有很多种算法,由于它效率很⾼,所以被⼴泛使⽤在很多加密协议的核⼼当中。

对称加密通常使⽤的是相对较⼩的密钥,⼀般⼩于256 bit。

因为密钥越⼤,加密越强,但加密与解密的过程越慢。

如果你只⽤1 bit来做这个密钥,那⿊客们可以先试着⽤0来解密,不⾏的话就再⽤1解;但如果你的密钥有1 MB⼤,⿊客们可能永远也⽆法破解,但加密和解密的过程要花费很长的时间。

密钥的⼤⼩既要照顾到安全性,也要照顾到效率,是⼀个trade-off。

DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

DES和TripleDES基本算法⼀致,只是TripleDES算法提供的key位数更多,加密可靠性更⾼。

DES使⽤的密钥key为8字节,初始向量IV也是8字节。

TripleDES使⽤24字节的key,初始向量IV也是8字节。

两种算法都是以8字节为⼀个块进⾏加密,⼀个数据块⼀个数据块的加密,⼀个8字节的明⽂加密后的密⽂也是8字节。

如果明⽂长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。

所以加密后的密⽂长度⼀定为8字节的整数倍下⾯举个例⼦:⾮对称加密为数据的加密与解密提供了⼀个⾮常安全的⽅法,它使⽤了⼀对密钥,公钥(public key)和私钥(private key)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java中如何进行加密和数字签名J2EE及框架 2008-05-06 12:02 阅读10 评论0字号:大中小分类:java_doc本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。

对密码学有兴趣的伙伴,推荐看Bruce Schneier的著作:Applied Crypotography。

在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对RSA算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍):一、密码学上常用的概念1)消息摘要:这是一种与消息认证码结合使用以确保消息完整性的技术。

主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jd k1.5对上面都提供了支持,在java中进行消息摘要很简单,java.security.MessageDigest提供了一个简易的操作方法:/***MessageDigestExample.java*Copyright 2005-2-16*/import java.security.MessageDigest;/***单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存*/public class MessageDigestExample{public static void main(String[] args) throws Exception{if(args.length!=1){System.err.println("Usage:java MessageDigestExample text");System.exit(1);}byte[] plainText=args[0].getBytes("UTF8");//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");System.out.println("\n"+messageDigest.getProvider().getInfo());//开始使用算法messageDigest.update(plainText);System.out.println("\nDigest:");//输出算法运算结果System.out.println(new String(messageDigest.digest(),"UTF8"));}}还可以通过消息认证码来进行加密实现,javax.crypto.Mac提供了一个解决方案,有兴趣者可以参考相关API文档,本文只是简单介绍什么是摘要算法。

2)私钥加密:消息摘要只能检查消息的完整性,但是单向的,对明文消息并不能加密,要加密明文的消息的话,就要使用其他的算法,要确保机密性,我们需要使用私钥密码术来交换私有消息。

这种最好理解,使用对称算法。

比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一个私钥(而在web环境下,私钥在传递时容易被侦听):使用私钥加密的话,首先需要一个密钥,可用javax.crypto.KeyGenerator产生一个密钥(java.security. Key),然后传递给一个加密工具(javax.crypto.Cipher),该工具再使用相应的算法来进行加密,主要对称算法有ES(实际密钥只用到56位),AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等,jdk1.5种也提供了对对称算法的支持,以下例子使用AES算法来加密:/***PrivateExmaple.java*Copyright 2005-2-16*/import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import java.security.Key;/***私鈅加密,保证消息机密性*/public class PrivateExample{public static void main(String[] args) throws Exception{if(args.length!=1){System.err.println("Usage:java PrivateExample <text>");System.exit(1);}byte[] plainText=args[0].getBytes("UTF8");//通过KeyGenerator形成一个keySystem.out.println("\nStart generate AES key");KeyGenerator keyGen=KeyGenerator.getInstance("AES");keyGen.init(128);Key key=keyGen.generateKey();System.out.println("Finish generating DES key");//获得一个私鈅加密类Cipher,ECB是加密方式,PKCS5Padding是填充方法Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");System.out.println("\n"+cipher.getProvider().getInfo());//使用私鈅加密System.out.println("\nStart encryption:");cipher.init(Cipher.ENCRYPT_MODE,key);byte[] cipherText=cipher.doFinal(plainText);System.out.println("Finish encryption:");System.out.println(new String(cipherText,"UTF8"));System.out.println("\nStart decryption:");cipher.init(Cipher.DECRYPT_MODE,key);byte[] newPlainText=cipher.doFinal(cipherText);System.out.println("Finish decryption:");System.out.println(new String(newPlainText,"UTF8"));}}3)公钥加密:上面提到,私钥加密需要一个共享的密钥,那么如何传递密钥呢?web环境下,直接传递的话很容易被侦听到,幸好有了公钥加密的出现。

公钥加密也叫不对称加密,不对称算法使用一对密钥对,一个公钥,一个私钥,使用公钥加密的数据,只有私钥能解开(可用于加密);同时,使用私钥加密的数据,只有公钥能解开(签名)。

但是速度很慢(比私钥加密慢100到1000倍),公钥的主要算法有RSA,还包括Bl owfish,Diffie-Helman等,jdk1.5种提供了对RSA的支持,是一个改进的地方:/***PublicExample.java*Copyright 2005-2-16*/import java.security.Key;import javax.crypto.Cipher;import java.security.KeyPairGenerator;import java.security.KeyPair;/***一个简单的公鈅加密例子,Cipher类使用KeyPairGenerator生成的公鈅和私鈅*/public class PublicExample{public static void main(String[] args) throws Exception{if(args.length!=1){System.err.println("Usage:java PublicExample <text>");System.exit(1);}byte[] plainText=args[0].getBytes("UTF8");//构成一个RSA密钥System.out.println("\nStart generating RSA key");KeyPairGenerator keyGen=KeyPairGenerator.getInstance("RSA");keyGen.initialize(1024);KeyPair key=keyGen.generateKeyPair();System.out.println("Finish generating RSA key");//获得一个RSA的Cipher类,使用公鈅加密Cipher cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");System.out.println("\n"+cipher.getProvider().getInfo());System.out.println("\nStart encryption");cipher.init(Cipher.ENCRYPT_MODE,key.getPublic());byte[] cipherText=cipher.doFinal(plainText);System.out.println("Finish encryption:");System.out.println(new String(cipherText,"UTF8"));//使用私鈅解密System.out.println("\nStart decryption");cipher.init(Cipher.DECRYPT_MODE,key.getPrivate());byte[] newPlainText=cipher.doFinal(cipherText);System.out.println("Finish decryption:");System.out.println(new String(newPlainText,"UTF8"));}}4)数字签名:数字签名,它是确定交换消息的通信方身份的第一个级别。

相关文档
最新文档