JAVA中AES对称加密和解密以及与Python兼容
引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作。
由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取加密后的密钥并解密,搜索了很多文章,索性最后实现了,自己整理一下。
Java语言实现AES加密及解密
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.lang.StringUtils; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; /**
* <p>Title: TestAES3</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2012 All rights reserved.</p>
* <p>Company: Neusoft Corporation, China, Ltd.</p>
* @author chendch
*
*/
public class TestAES3
{
private String ALGO = "AES";
private String ALGO_MODE = "AES/CBC/NoPadding";
private String akey = "keyskeyskeyskeys";
private String aiv = "keyskeyskeyskeys";
private String padding = " ";
private int blockSize = 16; /**
* @param content
* @return password
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws UnsupportedEncodingException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public String encrypt(String content)
throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException
{
String encryptContent = content;
if (encryptContent.length() < blockSize)
{
encryptContent = StringUtils.rightPad(content, blockSize, padding);
System.out.println("补位后:" + encryptContent);
} Cipher cipher = Cipher.getInstance(ALGO_MODE);
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] byteEncode = encryptContent.getBytes("utf-8");
byte[] byteAES = cipher.doFinal(byteEncode); String AESEncode = new String(new BASE64Encoder().encode(byteAES)); return AESEncode;
} /**
* @param content
* @return content
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws IOException
*/
public String decrypt(String content)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, IOException
{
byte[] byte_content = new BASE64Decoder().decodeBuffer(content); Cipher cipher = Cipher.getInstance(ALGO_MODE);
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8")); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] byte_decode = cipher.doFinal(byte_content);
String AES_decode = new String(byte_decode, "utf-8");
return AES_decode.trim();
} /**
* @param args
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws IOException
*/
public static void main(String[] args)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, IOException
{
TestAES3 testAES3 = new TestAES3();
String content = "chenduoc";
System.out.println("加密前:" + content); String encryptContent = testAES3.encrypt(content);
System.out.println("加密后:" + encryptContent); String decryptContent = testAES3.decrypt(encryptContent);
System.out.println("解密后:" + decryptContent);
}
}
Python实现AES加密及解密
#!/usr/bin/python
#coding=utf-8 from Crypto.Cipher import AES
import base64 BLOCK_SIZE = 16
PADDING = " "
key = "keyskeyskeyskeys"
iv = "keyskeyskeyskeys" pad_it = lambda s : s+(BLOCK_SIZE - len(s)) * PADDING def encrypt(content):
generator = AES.new(key, AES.MODE_CBC, iv)
encrypt_content = generator.encrypt(pad_it(content))
encode_content = base64.b64encode(encrypt_content) return encode_content def decrypt(content):
generator = AES.new(key, AES.MODE_CBC, iv)
decode_content = base64.b64decode(content)
decrypt_content = generator.decrypt(decode_content) return decrypt_content.rstrip(PADDING) content = "neteye"
print "加密前:",content encrypt_contnet = encrypt(content)
print "加密后:",encrypt_contnet decrypt_content = decrypt(encrypt_contnet)
print "解密后:",decrypt_content
注意点:Java中定义的key和iv变量和python中定义的必须一致,且加密的字符串需满足16位或24位等,不满足时需要进行补位,以上程序都已实现且可用。
JAVA中AES对称加密和解密以及与Python兼容的更多相关文章
- JAVA中AES对称加密和解密
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- java的AES对称加密和解密,有偏移量
import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...
- AES对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
- AES对称加密和解密(转)
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- JAVA实现AES的加密和解密算法
原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...
- eclipse JAVA实现AES的加密和解密算法
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...
- AES —— JAVA中对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- Java安全之对称加密、非对称加密、数字签名
原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...
随机推荐
- 【python画图】
1.热力图 import numpy as np import numpy.random import matplotlib.pyplot as plt # Generate some test da ...
- img标签替换为mip-img标签的方法
function replaceMipImages($content){ preg_match_all('/<img (.*?)\>/', $content, $images); if(! ...
- Flutter安卓客户端打包
想要安装到手机上,必须要进行打包,因为没有苹果手机,所以只能打包Android客户端的apk. 检查 App的配置 查看默认应用程序清单文件(位于/android/app/src/main/中的And ...
- MapReduce程序的开发过程
1. 在linux(虚拟机环境)下安装hadoop2.8.3 1.1 安装JDK环境 1.2 安装hadoop 1.3 进行配置:core-site.xml,hdfs-site.xml设置 1.4 初 ...
- ElasticSearch 获取es集群信息
参考博客:https://www.cnblogs.com/phpshen/p/8668833.html es集群信息有些版本下如果证书过期就会查不到,有些版本貌似不需要,提供一个据说不需要证书的版本的 ...
- Matlab JPEG详细介绍
作为一个基本的图像压缩方式,JPEG 已经得到了广泛的运用,但 JPEG 相关的基本原理,却经常被忽视,或解释得很不确切.这里我们详细讨论一下 JPEG 的编码原理,并结合实例来给出一个更加感性的认识 ...
- C++——文件的读写
C++中标准IO库的fstream头文件定义了三种支持文件IO的类型: ifstream,由istream派生而来,提供读文件的功能. ofstream,由ostream派生而来,提供写文件的功能. ...
- 日志.VC
1. int WriteLog(char* _pcFullFileName, char* _pcWrite, int _iWriteLen, unsigned long * _pdwWritten) ...
- javaweb项目的全局监听配置
在项目中有时候会遇到全局监听的需求,而全局性的监听该如何配置,代码如下: package com.demo.listener; import javax.servlet.ServletContextE ...
- 【转载】CASE WHEN 及 SELECT CASE WHEN的用法
原文链接:https://www.cnblogs.com/aipan/p/7770611.html Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WH ...