java linux aes_java AES 加密和linux解密
java AES 加密:package app;
import static java.nio.charset.StandardCharsets.US_ASCII;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Test{
/** OpenSSL's magic initial bytes. */
private static final String SALTED_STR = "Salted__";
private static final byte[] SALTED_MAGIC = SALTED_STR.getBytes(US_ASCII);
/**
*
* @param password The password / key to encrypt with.
* @param data The data to encrypt
* @return A base64 encoded string containing the encrypted data.
*/
static String encrypt(String password, String clearText) throws Exception{
final byte[] pass = password.getBytes(US_ASCII);
final byte[] salt = (new SecureRandom()).generateSeed(8);
final byte[] inBytes = clearText.getBytes(UTF_8);
final byte[] passAndSalt = array_concat(pass, salt);
byte[] hash = new byte[0];
byte[] keyAndIv = new byte[0];
for (int i = 0; i < 3 && keyAndIv.length < 48; i++) {
final byte[] hashData = array_concat(hash, passAndSalt);
final MessageDigest md = MessageDigest.getInstance("MD5");
hash = md.digest(hashData);
keyAndIv = array_concat(keyAndIv, hash);
}
final byte[] keyValue = Arrays.copyOfRange(keyAndIv, 0, 16);
final byte[] iv = Arrays.copyOfRange(keyAndIv, 16, 32);
final SecretKeySpec key = new SecretKeySpec(keyValue, "AES");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] data = cipher.doFinal(inBytes);
data = array_concat(array_concat(SALTED_MAGIC, salt), data);
return Base64.getEncoder().encodeToString( data );
}
/**
* @see http://stackoverflow.com/questions/32508961/java-equivalent-of-an-openssl-aes-cbc-encryption for what looks like a useful answer. The not-yet-commons-ssl also has an implementation
* @param password
* @param source The encrypted data
* @return
*/
static String decrypt(String password, String source) throws Exception{
final byte[] pass = password.getBytes(US_ASCII);
final byte[] inBytes = Base64.getDecoder().decode(source);
final byte[] shouldBeMagic = Arrays.copyOfRange(inBytes, 0, SALTED_MAGIC.length);
if (!Arrays.equals(shouldBeMagic, SALTED_MAGIC)) {
throw new IllegalArgumentException("Initial bytes from input do not match OpenSSL SALTED_MAGIC salt value.");
}
final byte[] salt = Arrays.copyOfRange(inBytes, SALTED_MAGIC.length, SALTED_MAGIC.length + 8);
final byte[] passAndSalt = array_concat(pass, salt);
byte[] hash = new byte[0];
byte[] keyAndIv = new byte[0];
for (int i = 0; i < 3 && keyAndIv.length < 48; i++) {
final byte[] hashData = array_concat(hash, passAndSalt);
final MessageDigest md = MessageDigest.getInstance("MD5");
hash = md.digest(hashData);
keyAndIv = array_concat(keyAndIv, hash);
}
final byte[] keyValue = Arrays.copyOfRange(keyAndIv, 0, 32);
final SecretKeySpec key = new SecretKeySpec(keyValue, "AES");
final byte[] iv = Arrays.copyOfRange(keyAndIv, 32, 48);
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
final byte[] clear = cipher.doFinal(inBytes, 16, inBytes.length - 16);
return new String(clear, UTF_8);
}
private static byte[] array_concat(final byte[] a, final byte[] b) {
final byte[] c = new byte[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}
public static void main(String[] args){
try {
String a = encrypt("tecmint","suning@123");
System.out.println(a);
} catch (Exception e) {
e.printStackTrace();
}
}
}
shell 调用系统函数解密:SPASS=$(echo ${SPASS} | openssl enc -aes-128-cbc -a -d -pass pass:tecmint)
java linux aes_java AES 加密和linux解密相关推荐
- Java中的AES加密和解密(CBC模式)
通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...
- Linux之zip加密压缩与解密解压(一百二十一)
Linux之zip加密压缩与解密解压 1.zip加密压缩目录 # zip -rP Abc#123 tmp.zip test/2.unzip解密解压缩 # unzip -P Abc#123 tmp.zi ...
- java如何实现aes加密_Java 如何实现AES加密
做360广告的对接需要对密码进行AES加密,下面是点睛平台文档的描述: (AES模式为CBC,加密算法MCRYPT_RIJNDAEL_128)对MD5加密后的密码实现对称加密.秘钥是apiSecret ...
- java AES 加密和linux解密
java AES 加密: package app;import static java.nio.charset.StandardCharsets.US_ASCII; import static jav ...
- JS前端加密和Java后端的AES加密和解密
先上前端代码 import cryptoJs from 'crypto-js' let keyOne = 'ZHyXgjF7BejeJySh5vX4O6qE'export default {//加密e ...
- java aes 中文_java实现AES加密(解决中文解密后乱码问题,解决传输字符串后解密报错的问题)...
在对安全性要求比较高的报文做加密的时候,算法有很多种,我这里主要用到的就是AES加密算法.由于在国内使用,所以不可避免的要对中文进行加密和解密,而在这个过程中,发现,如果不做处理,很容易会出现中文乱码 ...
- linux下图片加密原理,Linux中常见的加密技术介绍
常见的加密技术: 对称加密:非对称加密:单向加密:SSL/TLS:秘钥交换 1.对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密 ...
- window环境下AES加密文件无法解密问题记录
最近在做项目中遇到需要对数据进行AES加密,加密文件用openssl命令行解密. 在linux/unix 环境下测试没有问题,但在windows环境下一直解密失败,由于AES解密数据要求解密数据需16 ...
- linux下des加密命令,linux下的DES加密
linux下的DES加密 des_crypt, ecb_crypt, cbc_crypt, des_setparity, DES_FAILED 都是用于DES快速加密 调用格式 #include ...
最新文章
- Coing-二叉树(bibary Tree)
- 【100题】第十六题(层序打印树的节点)
- windows下自制动画层引擎 - 放两个demo
- 聊聊storm nimbus的LeaderElector
- 怎么快速搜索服务器里的文件,使用 Everything,快速搜索电脑文件,制作局域网资料搜索器 | 科技搜...
- 打基础一定要吃透这12类 Python 内置函数
- Netty : netty 4如何解决空轮询bug
- [iOS]如何把App打包成ipa文件,然后App上架流程[利用Application Loader]
- 《JavaScript语言精粹(修订版)》试读
- 一看就明白的超标量超流水线超线程简介
- Linux下基于LDAP统一用户认证的研究
- mysql日期相减返回月数_MySql日期相减返回月数_MySQL
- 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
- EXCEL如何批量调整图片大小?
- 游戏电影——《落花辞》
- Windows去掉文件名的括号
- MarkdownPad 2 安装配置及常见问题
- 三维模型进行视角相机变换
- RestTemplate的用法
- Python爬虫:给我一个链接,西瓜视频随便下载
热门文章
- java 获取组件大小_java - 如何初始化取决于组件大小的图像抓取? - 堆栈内存溢出...
- linux块设备驱动编写,Linux内核学习笔记 -49 工程实践-编写块设备驱动的基础
- Job 存储和持久化 (第四部分)
- java中HashSet对象内的元素的hashCode值不能变化
- 【two pointers 细节题】cf1041dD. Glider
- 最困难的是带着自己的选择生活下去
- [SHOI2001]小狗散步
- 2006年9月全国计算机等级考试三级数据库技术笔试试卷(含有答案)
- 关于Unity中GrabPass截屏的使用和Shader的组织优化
- 习题3.11 递归和非递归查找元素