我一直用这个把头撞在墙上.我需要对我的iPhone应用程序进行编码,以便在ECB模式下使用3DES加密4位"引脚",以便传输到我认为是用.NET编写的Web服务.
+ (NSData *)TripleDESEncryptWithKey:(NSString *)key dataToEncrypt:(NSData*)encryptData {
NSLog(@"kCCKeySize3DES=%d", kCCKeySize3DES);
char keyBuffer[kCCKeySize3DES+1]; // room for terminator (unused)
bzero( keyBuffer, sizeof(keyBuffer) ); // fill with zeroes (for padding)
[key getCString: keyBuffer maxLength: sizeof(keyBuffer) encoding: NSUTF8StringEncoding];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
size_t returnLength = ([encryptData length] + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
// NSMutableData* returnBuffer = [NSMutableData dataWithLength:returnLength];
char* returnBuffer = malloc(returnLength * sizeof(uint8_t) );
CCCryptorStatus ccStatus = CCCrypt(kCCEncrypt, kCCAlgorithm3DES , kCCOptionECBMode,
keyBuffer, kCCKeySize3DES, …Run Code Online (Sandbox Code Playgroud) 我有一个项目,规定了24字节数据块的以下加密规则.
1)密码学应使用9797-1中定义的全三重DES MAC算法作为MAC算法3进行,输出变换3没有截断,而CBC模式下的DES作为ICV设置为零的分组密码.最后8个字节的加密数据构成了我们需要的值.
该程序说加密完成是错误的.为了符合上述规格,我还需要做其他事吗?
数据是一个24字节的值,加密的输出应该是8个字节,我猜(根据规范).我得到整个24字节作为输出:(
我编写了以下代码来实现上述规范:
des.KeySize = 128;
des.Key = ParseHex(key);
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.None;
ICryptoTransform ic = des.CreateEncryptor();
CryptoOutput = ic.TransformFinalBlock(CryptoOutput, 0, 24);
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个:
MACTripleDES des = new MACTripleDES(ParseHex(key));
byte[] CDCryptp = des.ComputeHash(CryptoOutput);
Run Code Online (Sandbox Code Playgroud) 我试图使用PHP mcrypt函数解密由Java Triple DES函数加密的密钥,但没有运气.在下面找到java代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Encrypt3DES {
private byte[] key;
private byte[] initializationVector;
public Encrypt3DES(){
}
public String encryptText(String plainText, String key) throws Exception{
//---- Use specified 3DES key and IV from other source --------------
byte[] plaintext = plainText.getBytes();
byte[] myIV = key.getBytes();
byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62,
(byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF,
(byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67,
(byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95};
Cipher c3des = …Run Code Online (Sandbox Code Playgroud) 我有一个key.bin文件,其内容类似于:
-12, 110, 93, 14, -48, ...
Run Code Online (Sandbox Code Playgroud)
服务使用它来解密3DES内容,但我需要通过Ruby加密它.
我已经尝试了大量的场景,如何设置密钥以及如何处理它,但是到目前为止无济于事:
我认为我需要做的事情很简单:
des = OpenSSL::Cipher::Cipher.new('des3')
des.decrypt
des.key = mistery # this step is where i'm having problems at
final = des.update(encrypted) + des.final
Run Code Online (Sandbox Code Playgroud)
关于我应该用这个键做什么的任何想法?
关键样本:
-62,-53,124,-110,37,-88,-48,31,-57,93,70,-101,44,69,-88,-57,-123,-99,118,-119,110,55,11,14
Run Code Online (Sandbox Code Playgroud)
数据样本:
NEb2b9sYXgod6mTvaRv+MRsTJvIiTTI9VjnDGcxjxcN5qBH7FXvxYI6Oj16FeKKsoQvjAmdju2SQ
ifJqPJTl97xeEbjdwm+W8XJnWs99ku85EznVBhzQxI1H2jPiZIcrqIVCWdd/OQun7AjK4w2+5yb7
DPN2OiCIEOz2zK6skJrBw3oTEHpXrSEhydOYxqI+c5hC4z3k5nktN6WSVLIo8EAjwenHPMDxboWF
ET8R+QM5EznVBhzQxI1H2jPiZIcrqIVCWdd/OQun7AjK4w2+5yb7DPN2OiCIFqk4LRwEVq16jvKE
vjz6T4/G34kx6CEx/JdZ1LdvxC3xYQIcwS0wVnmtxorFm4q5QQFHzNKQ5chrGZzDkFzAogsZ2l2B
vcvlwgajNGHmxuVU83Ldn1e5rin7QqpjASqeDGFQHkiSbp4x6axVce2OGgfFpZdzCM7y6jLPpOlX
LOC/Bs1vTwMzcBNRB/Fo4nsX9i4It8Spm228XQNUpQe4i9QGe/4AyKIhHoM8DkXwPZ6rWp0W0UMe
keXjg41cED1JwjAAQSP3RYITB78bu+CEZKPOt2tQ2BvSw55mnFcvjIAYVQxCHliQ4PwgceHrnsZz
5aagC0QJ3oOKw9O0dlkVE3IM6KTBMcuZOZF19nCqxMFacQoDxjJY8tOJoN0Fe4Boz2FPyuggfLz9
yhljVJhxqOlTd8eA34Ex8SdC+5NDByAMumjzcPcXL8YVpSN85gytfd+skXhz3npmJ0dmZZOouu0Z
vMmlaCqw96Sy0L1mHLKbjqmZ/W57OBNRB/Fo4nsX9i4It8Spm228XQNUpQe4i9QGe/4AyKIhHoM8
DkXwPZ5tXdq1dRG6IaS51oNzFFlOoP3wTJuOTpj+zQOBMMOi4ENFyyEwYbG/qE+uY8rVwBOUHv9b
Yd9byvOZbnHDuf4oaWRZ+4K3s2NkEblDF9wU6Mb0ZqnLEJsypjrorH1cNIodIDu8nME1nD5bIDF6
XNrWC6pk6AV6eYQvNJw2QDz0RBD15fz/fAXCvbaCLDnhBKpLXrRbQdV+jxx2ipeC2ceMLLRFRPuR
B+ycYht65lWh4jNjoEsBXGFKiT0bSX6Lx/ZQD3twJWbML8ifRhw7SW0jOkUF+dAfXYNaD6nqA6Xq
TkcsDGaJsVq8wwCIWNh6tDRSw7ba4c391147kmnqEgXdKmmnEzUfHtpRw88C0/u0qj809hB4qB0B
lxj/87aDo4VOz9S4jjtk849CxtA/a9+532A4YlXjsPt/f0KZ2drAGEr1VSWzaLh/sMwP5tznmPaK
uozS6C74gMNdhtNMFz0HONcYecS0hg4lrdRyljROgzC33QoBIHbQXJrG0OXE3+81uhJwusEnFaD9
8Eybjk6YeNk3oxL3C5fx/xXgFmhcLLGdxRe/am0jqA1gV6MyQFUKtzdnNOUYpHkYXT9Ea7YYln4Q
D96Z9AI5EznVBhzQxI1H2jPiZIcrqIVCWdd/OQun7AjK4w2+5yb7DPN2OiCIFqk4LRwEVq16jvKE
vjz6T4/G34kx6CEx/JdZ1LdvxC3iEcYTrEH9kKhPrmPK1cATlB7/W2HfW8rzmW5xw7n+KGlkWfuC
t7NjZBG5QxfcFOjG9GapyxCbMqY66Kx9XDSKHSA7vJzBNZw+WyAxelza1guqZOgFenmElSgtUOo7
TEunuphaMIEQgo0udojG6dm2FtRmA4yntNCnCDzGTY72nrFBz3EZmVXGEm6X3Xd5Ito=
Run Code Online (Sandbox Code Playgroud) 我正在使用 3DES 对图像进行加密和解密。加密图像后,我无法看到加密的图像。谁能告诉我为什么会发生这种情况?我正在使用 jpeg 图像进行加密。所有这些过程都是用Java完成的。
我目前在 PHP 中对 3DES (des-ede-cbc) 进行加密和解密,如下所示:
php > $key = '0000000000000000';
php > $iv = '00000000';
php > $plaintext = '1234567812345678';
php > $ciphertext = openssl_encrypt($plaintext, 'des-ede-cbc', $key, 0, $iv);
php > echo $ciphertext;
LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P
php > $plaintext = openssl_decrypt($ciphertext, 'des-ede-cbc', $key, 0, $iv);
php > echo $plaintext;
1234567812345678
Run Code Online (Sandbox Code Playgroud)
我需要能够获取密文并在 python 中解密它。我发现的最接近的是 pycrypto: https: //gist.github.com/komuw/83ddf9b4ae8f995f15af
我的尝试:
>>> key = '0000000000000000'
>>> iv = '00000000'
>>> cipher_decrypt = DES3.new(key, DES3.MODE_CBC, iv)
>>> plaintext = cipher_decrypt.decrypt('LEvEJf9CI+5VTVNeIjARNamKH+PNTx2P')
>>> plaintext
b']v\xdf\xa7\xf7\xc0()\x08\xdf\xcb`4\xa7\x10\x9e\xaf\x8c\xb6\x00+_\xb3?2\x1d\\\x08\x01\xfa\xf2\x99'
Run Code Online (Sandbox Code Playgroud)
我不确定它有什么不同。它是 CBC 模式的 …
我们无法解密之前使用3DES和C#加密的ColdFusion中的字符串.这是我们最初用于加密字符串的代码:
public static string EncryptTripleDES(string plaintext, string key)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(plaintext);
string EncString = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
EncString = EncString.Replace("+", "@@12");
return EncString;
}
Run Code Online (Sandbox Code Playgroud)
我们尝试过使用这里的建议:
TripleDES加密 - .NET和ColdFusion玩得不好
..没有运气.这是我们的CF代码和错误:
<cfset variables.theKey = "blahblah" />
<cfset variables.theAlgorithm = "DESede/CBC/PKCS5Padding">
<cfset variables.theEncoding = "Base64">
<cfset strTest = decrypt(#DB.PASSWORD#, variables.theKey, variables.theAlgorithm, variables.theEncoding)>
Run Code Online (Sandbox Code Playgroud)
返回错误:尝试加密或解密输入字符串时发生错误:''无法解码字符串"blahblah"
因此,看起来它正在尝试解密密钥而不是字符串,但这并不是ColdFusion中概述解密函数的方式.有任何想法吗?
更新:尝试使用以下CF代码,但返回的错误仍然是"尝试加密或解密输入字符串时发生错误:给定最终块未正确填充."
<cfset dbPassword = "Hx41SYUrmnFPa31QCH1ArCHN1YOF8IAL">
<cfset …Run Code Online (Sandbox Code Playgroud) 我正在使用HSM和PKCS11处理密钥派生问题,目前我无法理解为什么我看到完全不同的结果取决于我是否使用deriveKey()方法而不是使用encrypt()方法.在这两种情况下,我都试图使用DESede/ECB/NoPadding算法来获得结果,但是根据我用来生成结果的方法(deriveKey与加密),我看到了不同的结果.
退一步以提供高级概述......我正在使用Global Platform使用的特定密钥派生方法来使用于智能卡的主密钥多样化.该方法以主密钥和用于导出新密钥的8字节数据(多样化数据)开始.div数据字节实际上只是使用DESede/ECB/NoPadding用主密钥加密,结果用作新导出的3DES密钥的一部分.(实际上,执行了多次加密,并将结果连接在一起形成新密钥,但这不是问题.)
我在两种情况下都验证了主密钥,验证了两种情况下的多样化数据是相同的,验证我使用相同的算法和相同的填充.我也尝试将派生密钥模板更改为DES,2DES,3DES.所有产生的结果都相似,只是长度不同.
目前我已经使用IAIK包装器(用Java编写的pkcs11包装器)实现了我的测试用例,我将在此处发布.密钥只是一个测试密钥,div数据是样本div数据,所以这里没有敏感信息.我首先在HSM中创建基本密钥,然后尝试使用多样化数据调用session.deriveKey()来获取新密钥.派生的关键字节以十六进制打印(键值不正确,基于我当前工作的实现,它在内存中而不是在HSM中导出密钥).接下来,我只是初始化会话以使用主密钥执行加密,然后加密多样化数据.这会产生预期值(再次根据工作实现进行检查).
当我使用相同的基本密钥,相同的div数据和相同的加密算法时,我正在寻找的是对这些操作产生不同结果的原因的任何了解.我不明白deriveKey()在表面下做了什么,我无法找到任何文档或源代码来阐明这一点.我必须能够使用deriveKey()方法,因为派生密钥在HSM外部不可用.
有任何见解赞赏.
Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_DES3_KEY_GEN);
List supportedMechanisms = Arrays.asList(token.getMechanismList());
if (!supportedMechanisms.contains(Mechanism.get(PKCS11Constants.CKM_DES3_KEY_GEN))) {
output_.println("Mechanism not supported: DES3_KEY_GEN");
return;
}
// This is the master key that I want to diversify
DES3SecretKey baseKeyTemplate = new DES3SecretKey();
baseKeyTemplate.getValue().setByteArrayValue(new byte[] {0x3d, 0x20, 0x5b, 0x29, (byte) 0xfd, 0x04, (byte) 0xd9, (byte) 0x89, (byte) 0xd0, (byte) 0xfd, (byte) 0x85, (byte) 0xd5, (byte) 0xf7, (byte) 0xb3, 0x31, (byte) 0xd3,
0x3d, 0x20, 0x5b, 0x29, (byte) 0xfd, 0x04, (byte) 0xd9, (byte) 0x89});
baseKeyTemplate.getDerive().setBooleanValue(Boolean.TRUE); …Run Code Online (Sandbox Code Playgroud) 在服务器端,密码字段的加密/解密在C#中完成.
现在,我需要在我的Android应用程序中实现相同的功能.所以,我按照本教程:http://ttux.net/post/3des-java-encrypter-des-java-encryption/如下:
import java.security.MessageDigest;
import java.security.spec.KeySpec;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Base64;
public class Encrypter {
private KeySpec keySpec;
private SecretKey key;
private IvParameterSpec iv;
public Encrypter(String keyString, String ivString) {
try {
final MessageDigest md = MessageDigest.getInstance("md5");
final byte[] digestOfPassword = md.digest(Base64.decodeBase64(keyString.getBytes("utf-8")));
final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
keySpec = new …Run Code Online (Sandbox Code Playgroud)