我们有一个遗留的ASP.NET站点,它使用加密方法:
http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx
当我们调用以下方法时,页面加载速度非常慢,最终返回Connection Reset:
Decrypt(" ", true);
Run Code Online (Sandbox Code Playgroud)
如果在后续页面请求中多次调用该方法,则应用程序池将关闭.
这发生在运行.NET framework v3.5的Windows 2008服务器上.
我把问题缩小到了TransformFinalBlock()电话.
注意:在Cassini上,我没有连接超时; 而是抛出以下异常:
System.Security.Cryptography.CryptographicException: Bad Data
Run Code Online (Sandbox Code Playgroud)
在其他字符串中调用Decrypt()会导致任何环境都没有问题.
为什么会这样?这是TripleDESCryptoServiceProvider中的错误吗?
显然,我可以过滤cipherString来拒绝""并避免这个特殊问题.但是,我担心我不怀疑的其他一些cipherString值会导致DoS.
更新2011.06.28
以下是重现该问题的最小代码:
// problem occurs when toEncryptArray is an empty array {}
byte[] toEncryptArray = {};
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
byte[] keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes("dummy_key"));
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateDecryptor();
// the following line can crashes the ASP.NET Application Pool (may …Run Code Online (Sandbox Code Playgroud) 我试图获得相当于C#MACTripleDES类的MAC TripleDES .
我试过跟随mcrypt(),但这只是在TripleDES编码.我需要获得一个等效的MACTripleDES字符串作为在C#中生成的字符串来验证消息.
我也查看了PHP的hash_hmac()功能,但它没有提供使用TripleDES生成MAC的选项
我正在尝试实施 VISA DUKPT 算法以从事务 KSN 为每个事务生成唯一密钥。我一步一步地遵循了 ANS X9.24-1:2009 提供的信息,但我得到的 IPEK 与示例中提供的不同。对于加密/解密/加密,我使用的是充气城堡 API。示例中提供的密钥 (BDK) 是 0123456789ABCDEFFEDCBA9876543210 我知道这是一个双重加密密钥长度意味着
我知道在使用 DES 时,您只能使用 8 字节密钥,因此 16 个十六进制字符串应转换为 8 字节数组。(我怀疑我是否在这里做某事。我从教程中获得了这部分代码)
public byte[] hexStringToByteArray(String hexstring) {
int i = 0;
if (hexstring == null || hexstring.length() <= 0) {
return null;
}
String stringvector = "0123456789ABCDEF";
byte[] bytevector = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用计算MAC
使用ISOIEC 9797-1 MAC算法3和分组密码DES,零IV(8字节)和1S09797-1填充方法2计算密码校验和.MAC长度必须是8字节
来自技术报告PM的机读旅行证件提供ICC只读访问版本:1.1日期:2004年10月1日.
我正在使用报告中的示例值:
Kenc:AB 94 FD EC F2 67 4F DF B9 B3 91 F8 5D 7F 76 F2
Kmac:79 62 D9 EC E0 3D 1A CD 4C 76 08 9D CE 13 15 43
eIFD:72 C2 9C 23 71 CC 9B DB 65 B7 79 B8 E8 D3 7B 29 EC C1 54 AA 56 A8 79 9F AE 2F 49 8F 76 ED 92 F2
但是,我没有得到相同的MAC,也不确定我需要怎么做.我的第一次尝试是:
MACTripleDES mac = new System.Security.Cryptography.MACTripleDES(Kmac);
mac.Initialize();
mac.Padding = PaddingMode.None; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些项目迁移.net framework 4.5到.net core.尝试迁移旧crypting/decrypting方法时会出现问题.该方法是一个TripleDES带有MD5哈希的密钥.MD5哈希总是返回16个字节.这个效果很好.net framework 4.5,但.net core在System.Security.Cryptography.Algorithms TripleDES只接受24个字节的密钥长度.在4.5中它接受16个字节或24个字节.有没有我可以尝试的变通方法?
后来编辑:初始化的时候到了TripleDes类调用新TripleDesImplementation这是这个.在此声明CNG不支持128位密钥.
管理员请不要将其标记为重复完整阅读我的问题.我正在加密和解密一些文本但是在运行在同一个文件中时,main运行正常,但是当我从外部调用它的加密和解密函数时.它在运行时发出错误.我附上了代码.包装desede;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import security.SHA256Algo;
import shradhafinalwiddesign.UpdateFile;
import shradhafinalwiddesign.UserRegistration;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Simple TripleDES Encrypt/Decrypt Test
* sha1, utf-8, no padding
*
* uses commons-codec-1.6
* javac -cp :commons-codec-1.6.jar TripleDESTest.java
* java -cp :commons-codec-1.6.jar TripleDESTest
*/
public class TripleDesDemo {
public static void main(String[] args) throws Exception {
String text = "textToEncrypt";
UserRegistration user = new UserRegistration() ;
user.setlUsername("tarunv") …Run Code Online (Sandbox Code Playgroud) 为什么此代码会返回弱键错误?
static public byte[] TDESDecrypt(byte[] toDecrypt, byte[] key, CipherMode mode = CipherMode.ECB, PaddingMode padding = PaddingMode.None)
{
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = mode;
tdes.Padding = padding;
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
tdes.Clear();
return resultArray;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试执行“tdes.Key = key”行时,出现错误
deriveSessionKeyIS System.Security.Cryptography.CryptographyException:指定的密钥是 TripleDES 的已知弱密钥,无法使用
为什么?我尝试的密钥是随机的,但测试的密钥之一是FB13347FE570DC4FFB13347FE570DC4F。哪里有问题?
我花了几个小时试图解决这个问题,但我无法让它发挥作用.我有一个C#加密例程,我需要在php中匹配.我无法改变C#版本,这不是一个选项(第三方对此很坚定).
这是C#代码:
//In C#
// Console.WriteLine(ApiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl"));
// Results in:
// XvHbR/CsLTo=
public static string ApiEncode(string data, string secret)
{
byte[] clear;
var encoding = new UTF8Encoding();
var md5 = new MD5CryptoServiceProvider();
byte[] key = md5.ComputeHash(encoding.GetBytes(secret));
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
byte[] input = encoding.GetBytes(data);
try { clear = des.CreateEncryptor().TransformFinalBlock(input, 0, input.Length); }
finally
{
des.Clear();
md5.Clear();
}
return Convert.ToBase64String(clear);
}
Run Code Online (Sandbox Code Playgroud)
这是我在PHP中提出的最好的东西:
//In PHP
// echo apiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl");
// Results in: …Run Code Online (Sandbox Code Playgroud) 我在PHP中有这个TRIPLE DES ENCRYPTION CODE
$encryption_key = "CE51E06875F7D964";
$data='tokenNo=test&securityCode=111' ;
echo $desEncryptedData = encryptText_3des($data, $encryption_key);//outputs 3des encrypted data
function encryptText_3des($plainText, $key) {
$key = hash("md5", $key, TRUE);
for ($x=0;$x<8;$x++) {
$key = $key.substr($key, $x, 1);
}
$padded = pkcs5_pad($plainText,
mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
return $encrypted;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
Run Code Online (Sandbox Code Playgroud)
我能够将数据加密为 xcFEvIdLXc2fjhG1i4iPOQu5L6ahxwZVucDOPqeMM2E=
现在我有了密钥,我能将这些数据解密为纯文本格式吗?
我试过这种方式
$encryption_key = "CE51E06875F7D964";
$data='xcFEvIdLXc2fjhG1i4iPOQu5L6ahxwZVucDOPqeMM2E=' ; //encrypted data
echo $desEncryptedData …Run Code Online (Sandbox Code Playgroud) 我需要使用 3DES 加密/解密数据。与我共享的密钥的形式为;
组件 1 = 111111111111111111111111111111111
组件 2 = 22222222222222222222222222222222
KVC = ABCD1234
我需要从上述组件创建 3DES 密钥,或 K1、k2、k3 子密钥,
我知道子键长 16 个字节,但是这些长 32 个字节。
请分享创建 3DES 密钥的过程。