java实现ase加密解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现ase加密解密相关的知识,希望对你有一定的参考价值。

1) 实现文件的加密、解密功能,使用AES算法
2) 计算文件的指纹,即SHA-1,SHA-256值

要有图形化界面,参考下图,求解!

参考技术A

这个算法java SDK自带的额 参考代码如下:

/**解密 

 * @param content  待解密内容 

 * @param password 解密密钥 

 * @return 

 */  

public static byte[] decrypt(byte[] content, String password)   

        try   

                 KeyGenerator kgen = KeyGenerator.getInstance("AES");  

                 kgen.init(128, new SecureRandom(password.getBytes()));  

                 SecretKey secretKey = kgen.generateKey();  

                 byte[] enCodeFormat = secretKey.getEncoded();  

                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");              

                 Cipher cipher = Cipher.getInstance("AES");// 创建密码器  

                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化  

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

                return result; // 加密  

         catch (NoSuchAlgorithmException e)   

                e.printStackTrace();  

         catch (NoSuchPaddingException e)   

                e.printStackTrace();  

         catch (InvalidKeyException e)   

                e.printStackTrace();  

         catch (IllegalBlockSizeException e)   

                e.printStackTrace();  

         catch (BadPaddingException e)   

                e.printStackTrace();  

          

        return null;  

  



/** 

 * 加密 

 *  

 * @param content 需要加密的内容 

 * @param password  加密密码 

 * @return 

 */  

public static byte[] encrypt(String content, String password)   

        try              

                KeyGenerator kgen = KeyGenerator.getInstance("AES");  

                kgen.init(128, new SecureRandom(password.getBytes()));  

                SecretKey secretKey = kgen.generateKey();  

                byte[] enCodeFormat = secretKey.getEncoded();  

                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  

                Cipher cipher = Cipher.getInstance("AES");// 创建密码器  

                byte[] byteContent = content.getBytes("utf-8");  

                cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化  

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

                return result; // 加密  

         catch (NoSuchAlgorithmException e)   

                e.printStackTrace();  

         catch (NoSuchPaddingException e)   

                e.printStackTrace();  

         catch (InvalidKeyException e)   

                e.printStackTrace();  

         catch (UnsupportedEncodingException e)   

                e.printStackTrace();  

         catch (IllegalBlockSizeException e)   

                e.printStackTrace();  

         catch (BadPaddingException e)   

                e.printStackTrace();  

          

        return null;  

  

http://blog.csdn.net/hbcui1984/article/details/5201247
图像界面的话就不说了

本回答被提问者和网友采纳
参考技术B 你只知道算法,做这个有什么难点吗?

(java加密解密)如何实现JCE接口的各种算法??

《java加密与解密的艺术》里面有一句话:根据JCE接口(安全提供者接口)。将各种算法实现后,打包成一个Provider(安全提供者),动态地加到Java运行环境中。现在要做一个 类似Provider的东西,并且这么包还要实现连接具体加密机的功能。
感谢有经验人士能说明详细思路。

关于如何去实现Provider,官方文档中有详细的说明。
请参照:http://download.oracle.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.html#Steps
参考技术A 在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();


追问

这个怎么加密解密很简单,我想知道怎么开发那个安全提供者包,谢谢

追答

这个...人家提供了我们直接拿来用就完了...你要修改人家提供的包~?这个是不是需要把人家的反编译出来再自己修改啊...有点儿深了额...呵呵~

以上是关于java实现ase加密解密的主要内容,如果未能解决你的问题,请参考以下文章

iOS 接口加密方法-ASE256和数字签名

使用postman发送ase加密请求

sha1base64ase加密

python3url编解码base64编解码ASE加解密

对接基金产品中遇到的相关问题

密码加密并存储在数据库中