android des加密string:
package com.example.ceshi;
import android.util.Log;
import com.blankj.utilcode.util.StringUtils;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
* @ProjectName: ceshi
* @Package: com.example.ceshi
* @ClassName: DESEncryptUtil
* @Description: java类作用描述
* @Author: 作者名
* @CreateDate: 2020/7/20 0020 下午 4:14
* @UpdateUser: 更新者:
* @UpdateDate: 2020/7/20 0020 下午 4:14
*/
public class DESEncryptUtil {
public static final String PASS_WORD = "f7f0f67e45";
private static SecretKeyFactory keyFactory = null;
private static Cipher cipher = null;
static {
try {
keyFactory = SecretKeyFactory.getInstance("DES");
} catch (Exception e) {
keyFactory = null;
}
try {
cipher = Cipher.getInstance("DES");
} catch (Exception e) {
cipher = null;
}
}
/**
* DES加密
*
* @param password 密码,长度要是8的倍数
* @return
*/
public static String encrypt(String data, String password) throws Exception {
try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂,然后用它把DESKeySpec转换成
if (keyFactory == null)
keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成加密操作
if (cipher == null)
cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
// 现在,获取数据并加密
// 正式执行加密操作
return ByteStringConvertUtil.byte2HexStr(cipher.doFinal(data.getBytes()));
} catch (Exception e) {
throw new Exception("DES解密失败!");
}
}
public static String decrypt(String data, String password) throws Exception {
try {
// DES算法要求有一个可信任的随机数源
SecureRandom random = new SecureRandom();
// 创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
// 创建一个密匙工厂
if (keyFactory == null)
keyFactory = SecretKeyFactory.getInstance("DES");
// 将DESKeySpec对象转换成SecretKey对象
SecretKey securekey = keyFactory.generateSecret(desKey);
// Cipher对象实际完成解密操作
if (cipher == null)
cipher = Cipher.getInstance("DES");
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
// 真正开始解密操作
return new String(cipher.doFinal(ByteStringConvertUtil.hexStr2Byte(data)));
} catch (Exception e) {
throw new Exception("DES解密失败!");
}
}
}
package com.example.ceshi;
public class ByteStringConvertUtil {
/**
* 字符串转换为字节数据
*
* @param hexStr
* @return
*/
public static byte[] hexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte result[] = new byte[hexStr.length() / 2];
for (int i = 0; i < hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
/**
* 字节数组转换为字符串
*
* @param buf
* @return
*/
public static String byte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 255);
if (hex.length() == 1)
hex = (new StringBuilder(String.valueOf('0'))).append(hex).toString();
sb.append(hex.toLowerCase());
}
return sb.toString();
}
}
测试代码:
@Test
public void ceshia() throws Exception {
String s = "a77a7aaaa";
byte [] data_Voucherno=s.getBytes();
if(data_Voucherno.length % 8 != 0){ //not a multiple of 8
//create a new array with a size which is a multiple of 8
byte[] padded = new byte[data_Voucherno.length + 8 - (data_Voucherno.length % 8)];
//copy the old array into it
System.arraycopy(data_Voucherno, 0, padded, 0, data_Voucherno.length);
data_Voucherno = padded;
}
String key = "CCIC2020";
String data=DESEncryptUtil.encrypt(s,key);
String undata=DESEncryptUtil.decrypt(data,key);
System.out.println(data+11);
System.out.println(undata+11);
}
还有一种:
package com.example.ceshi;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
* @ProjectName: ceshi
* @Package: com.example.ceshi
* @ClassName: Des
* @Description: java类作用描述
* @Author: 作者名
* @CreateDate: 2020/7/20 0020 下午 4:01
* @UpdateUser: 更新者:
* @UpdateDate: 2020/7/20 0020 下午 4:01
*/
public class Des {
/**
* 加密(使用DES算法)
*
* @param txt
* 需要加密的文本
* @param key
* 密钥
* @return 成功加密的文本
* @throws InvalidKeySpecException
* @throws InvalidKeyException
* @throws NoSuchPaddingException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static String enCrypto(String txt, String key)
throws InvalidKeySpecException, InvalidKeyException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException {
StringBuffer sb = new StringBuffer();
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory skeyFactory = null;
Cipher cipher = null;
try {
skeyFactory = SecretKeyFactory.getInstance("DES");
cipher = Cipher.getInstance("DES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
SecretKey deskey = skeyFactory.generateSecret(desKeySpec);
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] cipherText = cipher.doFinal(txt.getBytes());
for (int n = 0; n < cipherText.length; n++) {
String stmp = (java.lang.Integer.toHexString(cipherText[n] & 0XFF));
if (stmp.length() == 1) {
sb.append("0" + stmp);
} else {
sb.append(stmp);
}
}
return sb.toString().toUpperCase();
}
/**
* 解密(使用DES算法)
*
* @param txt
* 需要解密的文本
* @param key
* 密钥
* @return 成功解密的文本
* @throws InvalidKeyException
* @throws InvalidKeySpecException
* @throws NoSuchPaddingException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public static String deCrypto(String txt, String key)
throws InvalidKeyException, InvalidKeySpecException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException {
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
SecretKeyFactory skeyFactory = null;
Cipher cipher = null;
try {
skeyFactory = SecretKeyFactory.getInstance("DES");
cipher = Cipher.getInstance("DES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
SecretKey deskey = skeyFactory.generateSecret(desKeySpec);
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] btxts = new byte[txt.length() / 2];
for (int i = 0, count = txt.length(); i < count; i += 2) {
btxts[i / 2] = (byte) Integer.parseInt(txt.substring(i, i + 2), 16);
}
return (new String(cipher.doFinal(btxts)));
}
public static void main(String[] args) throws InvalidKeyException,
NoSuchAlgorithmException, InvalidKeySpecException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException {
String soureTxt = "这里是要加密的文本内容";
String key = "这里是自定义的密钥";
String str = null;
System.out.println("明文:" + soureTxt);
str = enCrypto(soureTxt, key);
System.out.println("加密:" + str);
System.out.println("解密:" + deCrypto(str, key));
System.out.println(str + "====" + key);
}
}
国密算法是什么? 国密算法是由国家密码局发布,包含SM1、SM2、 SM3、 SM4、 SSF33算法。 国际算法是什么? 国际算法由美国的安全局发布,是现今最通用的商用算法。 密码学中应用最为广泛算法都有哪些? 密码学中应用最为广泛的的三类算法: 1、对称算法(分组密码算法)代表分组密码算法(DES和SM4); 2、非对称算法(公钥密码算法)代表公钥密码算法(RSA和SM2); 3、杂凑算法(摘要算法)代表摘要算法(HAS-256系列和SM3);
pin密文是1.1+1.2
1+2=3,最后1和2进行二进制异或,3出表示07 和密码是什么后面异或
主密加密工密,工密加密密码
密码加密就好比,方程式,也可以说实一种投影,就是密码通过工作密码进行加密进行传输,好比密码是x,密钥是参数y通过方程式运算得出z:就是密文。反向地逻辑就是解密。
还有主密钥,就是加密工作密钥,这时候,工作密钥是x,通过方程式输出y:是工作密钥的密文,这样的话密码的安全程度就会更高。
我的 理解就是将其理解成为方程式,
des,3des,sm2,sm4,rsa都是加密形式,好比不同函数,不同维度的方程式。
期间的运算是通过,二进制数据,进行移位,补位,进行异或,与,非运算进行加密,生成密文。
明文就是你的密码了。
密码(cipher)
密码学中的密码(cipher)和我们日常生活中所说的密码不太一样,计算机术语『密码 cipher』是一种用于加密或者解密的算法,而我们日常所使用的『密码 password』是一种口令,它是用于认证用途的一组文本字符串,这里我们要讨论的是前者:cipher。
密钥(key)
密钥是一种参数,它是在使用密码(cipher)算法过程中输入的参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个8位的密钥最多有256种情况,使用穷举法,能非常轻易的破解,知名的DES算法使用56位的密钥,目前已经不是一种安全的加密算法了,主要还是因为56位的密钥太短,在数小时内就可以被破解。密钥分为对称密钥与非对称密钥。
明文/密文
明文(plaintext)是加密之前的原始数据,密文是通过密码(cipher)运算后得到的结果成为密文(ciphertext)
对称密钥
对称密钥(Symmetric-key algorithm)又称为共享密钥加密,对称密钥在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是他也有缺点,密钥需要在通讯的两端共享,让彼此知道密钥是什么对方才能正确解密,如果所有客户端都共享同一个密钥,那么这个密钥就像万能钥匙一样,可以凭借一个密钥破解所有人的密文了,如果每个客户端与服务端单独维护一个密钥,那么服务端需要管理的密钥将是成千上万,这会给服务端带来噩梦
非对称密钥
非对称密钥(public-key cryptography),又称为公开密钥加密,服务端会生成一对密钥,一个私钥保存在服务端,仅自己知道,另一个是公钥,公钥可以自由发布供任何人使用。客户端的明文通过公钥加密后的密文需要用私钥解密。非对称密钥在加密和解密的过程的使用的密钥是不同的密钥,加密和解密是不对称的,所以称之为非对称加密。与对称密钥加密相比,非对称加密无需在客户端和服务端之间共享密钥,只要私钥不发给任何用户,即使公钥在网上被截获,也无法被解密,仅有被窃取的公钥是没有任何用处的。常见的非对称加密有RSA,非对称加解密的过程:
1.服务端生成配对的公钥和私钥
2.私钥保存在服务端,公钥发送给客户端
3.客户端使用公钥加密明文传输给服务端
4.服务端使用私钥解密密文得到明文
数字签名
数据在浏览器和服务器之间传输时,有可能在传输过程中被冒充的盗贼把内容替换了,那么如何保证数据是真实服务器发送的而不被调包呢,同时如何保证传输的数据没有被人篡改呢,要解决这两个问题就必须用到数字签名,数字签名就如同日常生活的中的签名一样,一旦在合同书上落下了你的大名,从法律意义上就确定是你本人签的字儿,这是任何人都没法仿造的,因为这是你专有的手迹,任何人是造不出来的。那么在计算机中的数字签名怎么回事呢?数字签名就是用于验证传输的内容是不是真实服务器发送的数据,发送的数据有没有被篡改过,它就干这两件事,是非对称加密的一种应用场景。不过他是反过来用私钥来加密,通过与之配对的公钥来解密。
第一步:服务端把报文经过Hash处理后生成摘要信息Digest,摘要信息使用私钥private-key加密之后就生成签名,服务器把签名连同报文一起发送给客户端。
第二步:客户端接收到数据后,把签名提取出来用public-key解密,如果能正常的解密出来Digest2,那么就能确认是对方发的。
第三步:客户端把报文Text提取出来做同样的Hash处理,得到的摘要信息Digest1,再与之前解密出来的Digist2对比,如果两者相等,就表示内容没有被篡改,否则内容就是被人改过了。因为只要文本内容哪怕有任何一点点改动都会Hash出一个完全不一样的摘要信息出来。
数字证书(Certificate Authority):证明数字签名
数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证,这个凭证是被大家(浏览器)所认可的,为什么需要用数字证书呢,难道有了数字签名还不够安全吗?有这样一种情况,就是浏览器无法确定所有的真实服务器是不是真的是真实的,举一个简单的例子:A厂家给你们家安装锁,同时把钥匙也交给你,只要钥匙能打开锁,你就可以确定钥匙和锁是配对的,如果有人把钥匙换了或者把锁换了,你是打不开门的,你就知道肯定被窃取了,但是如果有人把锁和钥匙替换成另一套表面看起来差不多的,但质量差很多的,虽然钥匙和锁配套,但是你却不能确定这是否真的是A厂家给你的,那么这时候,你可以找质检部门来检验一下,这套锁是不是真的来自于A厂家,质检部门是权威机构,他说的话是可以被公众认可的(呵呵)。
同样的, 因为如果有人(张三)用自己的公钥把真实服务器发送给浏览器的公钥替换了,于是张三用自己的私钥执行相同的步骤对文本Hash、数字签名,最后得到的结果都没什么问题,但事实上浏览器看到的东西却不是真实服务器给的,而是被张三从里到外(公钥到私钥)换了一通。那么如何保证你现在使用的公钥就是真实服务器发给你的呢?我们就用数字证书来解决这个问题。数字证书一般由数字证书认证机构(Certificate Authority)颁发,证书里面包含了真实服务器的公钥和网站的一些其他信息,数字证书机构用自己的私钥加密后发给浏览器,浏览器使用数字证书机构的公钥解密后得到真实服务器的公钥。这个过程是建立在被大家所认可的证书机构之上得到的公钥,所以这是一种安全的方式。