`
这些年
  • 浏览: 402138 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DES对称加密(转)

    博客分类:
  • java
 
阅读更多

本文以使用DES对称加密算法为例使用jdk对数据进行加密解密。

 

首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部。Provider 可能实现的服务包括: 
算法(如DES、RSA、MD5);密钥的生成、转换和管理。 
通常java运行时环境至少安装了一个名字为“SUN”的预设Provider,如果查看本机支持的Provider类型可以通过以下代码:

        for(Provider p : Security.getProviders()){
            System.out.println(p.getName()+":"+p.getInfo());  
        }


我本机运行结果为:

SUN:SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
SunRsaSign:Sun RSA signature provider
SunJSSE:Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE:SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
SunJGSS:Sun (Kerberos v5, SPNEGO)
SunSASL:Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
XMLDSig:XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
SunPCSC:Sun PC/SC provider
SunMSCAPI:Sun's Microsoft Crypto API provider

从结果中可以看到名称为“SunJCE”的Provider提供DES、Triple DES(即3DES), AES、RSA、Diffie-Hellman等算法的实现,下面使用此Provider完成对称加密。

KeyGenerator类提供(对称)密钥生成器的功能,使用getInstance 类方法构造,代码如下:

KeyGenerator kg = KeyGenerator.getInstance("DES","SunJCE");


SecretKey类是对称密钥的封装类,它不包含方法或常量,其唯一目的是分组对称密钥(并为其提供类型安全),从kg中获取 

SecretKey key = kg.generateKey();


以上是产生密钥的过程,真正实现对数据加解密功能的类是Cipher,此类为加密和解密提供密码功能,它构成了 Java Cryptographic Extension (JCE) 框架的核心。
为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求“转换”的名称传递给它,还可以指定Provider的名称,本文中采用“SunJCE”。
“转换”是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案(反馈模式和填充方案可以理解为 加密前对数据的预处理)
“转换”具有以下两种形式:“算法/模式/填充”或“算法”(这种情况,使用模式和填充方案特定于Provider的默认值)。本例中采用以下有效的转换:

Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案

使用CBC反馈模式需要一个初始化向量,由类IvParameterSpec来完成,它需要是一个长度为8的byte数组。

 

Cipher的init方法负责初始化,初始化需要指定模式和密钥,密钥本文采用上面已经生成的key,模式有四种ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE、UNWRAP_MODE分别表示加密、解密、密钥包装或密钥解包。
如果加密则采用方法init(Cipher.ENCRYPT_MODE, key);
如果解密则采用方法init(Cipher.DECRYPT_MODE, key);
WRAP_MODE、UNWRAP_MODE模式是用来实现数字信封用的,本文不作介绍。
通常对数据进行加解密,使用方法doFinal(byte[] input),传入参数是byte数组。
为了在http协议下快速传输数据,且某些系统中只能使用ASCII字符,通常采用Base64编码。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。还可以提高可视性。

通过以上分析可以得到以下代码: 

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class SecurityTest {

    //密钥生成器
    private KeyGenerator kg; 
    
    //对称密钥  
    private SecretKey key;  
    
    //加解密时的初始化向量must be 8 bytes long
    private IvParameterSpec iv;
    
    //Cipher,加解密主体实例
    private Cipher c;  
    
    //该构造方法初始化DES密钥和Cipher  
    public SecurityTest() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, UnsupportedEncodingException{
        kg = KeyGenerator.getInstance("DES","SunJCE");  
        key = kg.generateKey();
        iv = new IvParameterSpec("12345678".getBytes("UTF-8"));
        c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案 ,SunJCE:Provider
    }  
      
    /** 
     * DES加密
     */  
    public String encrypt(String src) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException{  
        //初始化-- ENCRYPT_MODE:加密模式, key:密钥,iv:初始化向量
        c.init(Cipher.ENCRYPT_MODE, key, iv);  
        byte[] srcByte = src.getBytes();  
        //加密
        byte[] targetByte = c.doFinal(srcByte); 
        //Base64编码
        String targetString = new BASE64Encoder().encode(targetByte);
        return targetString;  
    }  
  
    /** 
     * DES解密 
     */  
    public String decrypt(String srcString) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException, InvalidAlgorithmParameterException {  
        //初始化-- DECRYPT_MODE:解密模式, key:密钥,iv:初始化向量
        c.init(Cipher.DECRYPT_MODE, key, iv); 
        //Base64解码
        byte[] srcByte = new BASE64Decoder().decodeBuffer(srcString);
        //解密
        byte[] targetByte = c.doFinal(srcByte);  
        return new String(targetByte);  
    }  
  
    public static void main(String[] args) throws Exception {  
        SecurityTest test = new SecurityTest();  
        String src = "使用JKD进行加解密--DES算法测试!__小印";  
        System.out.println("原文:" + src);
        String secret = test.encrypt(src);    
        System.out.println("密文:" + secret); 
        String target = test.decrypt(secret);
        System.out.println("解密得到原文:" + target);  
    } 

 

我本机运行结果为:

 

原文:使用JKD进行加解密--DES算法测试!__小印
密文:P8Xi4Jfvq9Eus0c1OTE32wK60rjHwPxZ8tRiElxOd5m69+vI37IGtw==
解密得到原文:使用JKD进行加解密--DES算法测试!__小印


注意:本文采用的是随机密钥,所以每次运行得到的密文是不一样的,jdk也提供自定义的密钥 ^_^

分享到:
评论

相关推荐

    DES对称加密IOS

    DES对称加密 支持IOS,mac编译

    java实现DES对称加密

    本文将详细介绍如何使用Java语言实现DES对称加密,并讨论其在实际应用中的作用和注意事项。 DES是一种块密码,它将64位的数据块作为输入,通过一系列复杂的数学运算(包括置换和代替操作)将其转换为密文。虽然原始...

    DES对称加密

    DES对称加密 是一种很早有IBM实现的对称加密!

    密码学实验_对称加密算法DES_非对称加密算法RSA.pdf

    本实验报告主要涉及两种加密算法:对称加密算法DES(Data Encryption Standard)和非对称加密算法RSA。实验旨在帮助学生深入理解这两种算法的基本原理,并通过Python编程实现加密和解密过程。 ### **对称加密算法...

    C语言实现的DES对称加密算法

    C语言实现的DES对称加密算法,老师布置的实验作业,原创,花了不少时间才调试成功。

    AES/DES 对称加密算法

    DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.

    C#实现3DES对称加密

    3DES(Triple Data Encryption Algorithm)是一种广泛应用的对称加密算法,它基于DES(Data Encryption Standard)并增强了安全性。本篇文章将详细探讨如何在C#环境中使用3DES进行数据加密,特别针对VS2005编译环境...

    DES对称加密算法的课件,非常实用

    DES加密算法是一种对称加密算法。DES加密算法是一种对称加密算法。

    DES对称加密算法Java实现

    DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。

    C# des对称加密字符串实例

    在IT领域,对数据进行加密...通过上述步骤,你可以在C#中实现一个完整的DES对称加密字符串的实例。在开发过程中,确保遵循最佳实践,如使用强密钥,避免明文存储敏感数据,以及在可能的情况下,使用更现代的加密算法。

    Java利用DES私钥对称加密实例

    Java中的DES(Data Encryption Standard)是一种广泛使用的对称加密算法,它基于一个固定的密钥进行数据的加密和解密。这个实例将详细讲解如何在Java...通过分析这些代码,你可以更好地理解和实践Java中的DES对称加密。

    RSA非对称加密和DES对称加密代码示例

    其中,RSA非对称加密和DES对称加密是两种常见的加密算法。这篇文章将详细介绍这两种加密方法,并通过代码示例进行阐述。 **RSA非对称加密** RSA(Rivest-Shamir-Adleman)是非对称加密算法的代表,由Ron Rivest、...

    转 JAVA加密解密DES对称加密算法.doc

    转 JAVA加密解密DES对称加密算法.doc

    Java-Js双向Des对称加密Demo

    本示例"Java-Js双向Des对称加密Demo"提供了在Java和JavaScript两个平台间实现DES加密解密的互操作性。下面将详细阐述DES加密解密的核心原理、Java和JavaScript的实现细节以及如何在两者之间进行兼容。 DES是一种块...

    DES对称加密算法进行加密和解密

    DES对称加密算法进行加密和解密的步骤: 输入8位密钥和数据。 将输入的数据分别转换为16位十六进制和字符输出。 使用输入的密钥对数据进行加密。加密过程中会进行一系列的置换、替代和移位操作。 将加密后的结果...

    Des对称加密解密

    使用DES加密与解密,可对byte[],String类型进行加密与解密 密文可使用String,byte[]存储.

    3Des对称加密在JS实现

    3Des对称加密在JS实现,此处代码要与https://blog.csdn.net/yufang131/article/details/79869964文章一起看(只包含JS部分)。《三重Des对称加密在JS、Android、Ios 和Java 平台的实现(多加一个JS实现)》

    常见加密算法方式(对称加密和非对称加密)

    - **DES(Data Encryption Standard)**:数据加密标准,是早期广泛使用的一种对称加密算法,但由于其密钥长度较短(56位),安全性相对较低。 - **3DES(Triple DES)**:基于DES改进而来,通过使用三个不同的密钥...

    关于des的对称加密算法

    一个用java做得关于des的对称加密算法。

    DES对称加密算法研究及C_编程实现

    ### DES对称加密算法研究及C++编程实现 #### 一、引言 随着互联网的飞速发展,数据通信的频率显著增加,保障数据在网络传输中的安全变得至关重要。加密技术,特别是对称加密算法,如DES(Data Encryption Standard...

Global site tag (gtag.js) - Google Analytics