起因
首先,對于一個公司,即有.net又有java開發來說,加解密是需要相互打通的,因為,根據莫非定律你遲早會有“.net加密讓java解密“的情況,
.net實作
public static string Encrypt(SymmetricAlgorithm algorithm, string plaintext, string key)
{
TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
algorithm.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
algorithm.Mode = CipherMode.ECB;
Console.WriteLine("IV=" + Convert.ToBase64String(algorithm.IV));
ICryptoTransform transformer = algorithm.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(plaintext);
byte[] result = transformer.TransformFinalBlock(Buffer, 0, Buffer.Length);
return Convert.ToBase64String(result);
}
.net和java的幾個不同
- byte型別對于.net是(0255),而java來說它是有符號的,是(-128127)
- 對于DES來說,默認的java支持的密鑰是8位元組,而.net里algorithm.Key是16個位元組,所以用原生Java的des是不能和.net互通的
java實作
需要第三方包bcprov-jdk15on
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.64</version>
<scope>compile</scope>
</dependency>
實作與.net互通的加密程序
private static final String ALGORITHM = "DESede";
private static final String CIPHER_TRANSFER = "DESede/ECB/PKCS5Padding";
private static final String ENCODING = "UTF-8";
static {
init();
}
public static void init() {
BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
Security.addProvider(bouncyCastleProvider);
}
/**
* 初始化key.
*
* @param key
*/
@SneakyThrows
static SecretKey getSecretKey(String key) {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bkeys = md5.digest(key.getBytes());
SecretKey secretKey = new SecretKeySpec(bkeys, ALGORITHM);
return secretKey;
}
/**
* 字串加密.
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
@SneakyThrows
public static String encryptToBase64(String plainText, String key) {
SecretKey secretKey = getSecretKey(key);
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFER);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(plainText.getBytes(ENCODING));
String s1 = Base64.encodeBase64String(result);
return s1;
}
上面代碼,主要是對于key的生成要注意,使用了與.net相同的md5對原始key進行的加密,保存它是16個位元組,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262787.html
標籤:Java
上一篇:手把手教你Spring Boot整合Mybatis Plus和Swagger2
下一篇:mybatis一個有意思的東西
