2015年08月06日
加解密函数在php,java和c#上的适配
一般加密解密使用通用的加解密算法, 但是各个语言的使用方法也不同, 有时候搞来搞去的, 发现php加出来的java又解不了, 最近看了下
其实一个加密api的使用主要有三个部分, 只要各个语言的三种模式都设置相同, 那么就能相互加解密成功, 这三个部分是:
算法
块模式
填充模式
三种语言的使用加解密库代码:
java
由Cipher.getInstance() 函数直接设定并获得加密类
private static String decrypt(String value,String key) {
try{
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),"TripleDES");
Cipher cipher = Cipher.getInstance("TripleDES/ECB/NoPadding"); // 算法/块模式/填充模式
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decryptedByte=cipher.doFinal(Base64.getDecoder().decode(value.getBytes()));
return new String(decryptedByte);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
c# 的
由XXXXXXCryptoServiceProvider 类提供加密算法, 他的Mode属性设置模式,Padding属性设置填充模式
public static string DESDeCode(string pToDecrypt, string sKey)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); //算法
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
tdes.Key = Encoding.UTF8.GetBytes(sKey);
tdes.Mode = CipherMode.ECB;//块模式
tdes.Padding = PaddingMode.Zeros;//填充模式
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
string str = Encoding.UTF8.GetString(resultArray);
return str;
}
php
php最简单, 一个函数就搞定, 第一个参数设置算法, 第四个参数设置模式; php默认的填充模式是Zeros, 也就是填充0
$text = mcrypt_decrypt(
MCRYPT_TRIPLEDES,//指定算法
$KEY,$cryptStr,
MCRYPT_MODE_ECB//块模式
);
对应关系示例
php
java
c#
MCRYPT_TRIPLEDES, MCRYPT_MODE_ECB
“TripleDES/ECB/NoPadding”
TripleDESCryptoServiceProvider, CipherMode.ECB, PaddingMode.Zeros
MCRYPT_TRIPLEDES, MCRYPT_MODE_CBC
“TripleDES/CBC/NoPadding”
TripleDESCryptoServiceProvider, CipherMode.CBC, PaddingMode.Zeros
CBC 和 ECB
加密实际上就是把要加密的明文按位数分块, 然后再把密码也分块, 把明文块和密码块输入到加密算法中计算得到密文块的过程; 而CBC ECB指定的是明文块和密码块的输入方式
ECB模式就是简单的对应, 明文块0对应密码块0, 输入到算法中得到密文块0, 用图说明:

CBC模式, 它还需要一个叫iv的变量, 明文块0先和iv计算, 然后对应密码块0 , 输入到算法中得到密文块0, 密文块1则是通过明文块1和上一步的结果, 也就是密文块0计算, 再和密码块1输入到算法中得到

java 可用[算法/块模式/填充模式]列表
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)
php的算法列表
define (‘MCRYPT_ENCRYPT’, 0);
define (‘MCRYPT_DECRYPT’, 1);
define (‘MCRYPT_DEV_RANDOM’, 0);
define (‘MCRYPT_DEV_URANDOM’, 1);
define (‘MCRYPT_RAND’, 2);
define (‘MCRYPT_3DES’, “tripledes”);
define (‘MCRYPT_ARCFOUR_IV’, “arcfour-iv”);
define (‘MCRYPT_ARCFOUR’, “arcfour”);
define (‘MCRYPT_BLOWFISH’, “blowfish”);
define (‘MCRYPT_BLOWFISH_COMPAT’, “blowfish-compat”);
define (‘MCRYPT_CAST_128’, “cast-128”);
define (‘MCRYPT_CAST_256’, “cast-256”);
define (‘MCRYPT_CRYPT’, “crypt”);
define (‘MCRYPT_DES’, “des”);
define (‘MCRYPT_ENIGNA’, “crypt”);
define (‘MCRYPT_GOST’, “gost”);
define (‘MCRYPT_LOKI97’, “loki97”);
define (‘MCRYPT_PANAMA’, “panama”);
define (‘MCRYPT_RC2’, “rc2”);
define (‘MCRYPT_RIJNDAEL_128’, “rijndael-128”);
define (‘MCRYPT_RIJNDAEL_192’, “rijndael-192”);
define (‘MCRYPT_RIJNDAEL_256’, “rijndael-256”);
define (‘MCRYPT_SAFER64’, “safer-sk64”);
define (‘MCRYPT_SAFER128’, “safer-sk128”);
define (‘MCRYPT_SAFERPLUS’, “saferplus”);
define (‘MCRYPT_SERPENT’, “serpent”);
define (‘MCRYPT_THREEWAY’, “threeway”);
define (‘MCRYPT_TRIPLEDES’, “tripledes”);
define (‘MCRYPT_TWOFISH’, “twofish”);
define (‘MCRYPT_WAKE’, “wake”);
define (‘MCRYPT_XTEA’, “xtea”);
define (‘MCRYPT_IDEA’, “idea”);
define (‘MCRYPT_MARS’, “mars”);
define (‘MCRYPT_RC6’, “rc6”);
define (‘MCRYPT_SKIPJACK’, “skipjack”);
php的块模式列表
define (‘MCRYPT_MODE_CBC’, “cbc”);
define (‘MCRYPT_MODE_CFB’, “cfb”);
define (‘MCRYPT_MODE_ECB’, “ecb”);
define (‘MCRYPT_MODE_NOFB’, “nofb”);
define (‘MCRYPT_MODE_OFB’, “ofb”);
define (‘MCRYPT_MODE_STREAM’, “stream”);
c#的块模式列表
CBC
CFB
CTS
ECB
OFB
c#的填充模式列表
ANSIX923
ISO10126
None
PKCS7
Zeros
本文探讨了如何确保PHP、Java和C#在使用通用加密API时的互操作性,关键在于设置相同的算法、块模式和填充模式。作者详细列举了各种加密算法、模式和填充选项,并提供了示例代码,以助于开发者解决跨平台加解密问题。

3294

被折叠的 条评论
为什么被折叠?



