我试图让TripleDES加密工作在Java中.从维基百科的文章下Keying Options,我想用选项1,其中All three keys are independent.
从Cipher文档中可以看到这里的参考指南,但我仍然不清楚.
我正在努力运行示例,并在不同的项目中使用这两行:
Cipher c = Cipher.getInstance("DESede");
Cipher cipher = Cipher.getInstance("TripleDES/ECB/PKCS5Padding");
Run Code Online (Sandbox Code Playgroud)
编译都很好,那有什么区别?我应该使用其中一个吗?这两个都可以使用三个独立的键吗?
最近出现了一个问题,即使用TripleDES标准将请求字符串加密的支付处理器连接到API以用作令牌.我们的应用程序使用ColdFusion运行,它有一个加密标签 - 支持TripleDES - 但是我们得到的结果并不是支付处理器所期望的.
首先,这是支付处理器所期望的结果令牌.
AYOF+kRtg239Mnyc8QIarw==
Run Code Online (Sandbox Code Playgroud)
下面是我们正在使用的ColdFusion的片段,以及结果字符串.
<!--- Coldfusion Crypt (here be monsters) --->
<cfset theKey="123412341234123412341234">
<cfset theString = "username=test123">
<cfset strEncodedEnc = Encrypt(theString, theKey, "DESEDE", "Base64")>
<!---
resulting string(strEncodedEnc): tc/Jb7E9w+HpU2Yvn5dA7ILGmyNTQM0h
--->
Run Code Online (Sandbox Code Playgroud)
如您所见,这并没有返回我们希望的字符串.寻求解决方案,我们为此过程抛弃了ColdFusion,并尝试在PHP中重现令牌.
现在我知道各种语言以不同的方式实现加密 - 例如在过去管理C#应用程序和PHP后端之间的加密,我不得不玩填充以使两者交谈,但是我的经验是,PHP在加密标准方面通常表现得很好.
无论如何,我们尝试的PHP源代码和结果字符串.
/* PHP Circus (here be Elephants) */
$theKey="123412341234123412341234";
$theString="username=test123";
$strEncodedEnc=base64_encode(mcrypt_ecb (MCRYPT_3DES, $theKey, $theString, MCRYPT_ENCRYPT));
/*
resulting string(strEncodedEnc): sfiSu4mVggia8Ysw98x0uw==
*/
Run Code Online (Sandbox Code Playgroud)
正如您可以清楚地看到的那样,我们有另一个字符串,它与支付处理器预期的字符串和ColdFusion生成的字符串不同.提示头对墙集成技术.
经过与支付处理器的多次往复通信(很多代表说"我们无法解决编码问题,你必须做错了,阅读手册")我们最终被升级为超过一对脑细胞在一起摩擦,能够退后一步,实际观察和诊断问题.
他同意,我们的CF和PHP尝试没有产生正确的字符串.经过快速搜索,他还同意这不是我们的来源,而是两种语言如何实现他们对TripleDES标准的看法.
今天早上进入办公室时,我们遇到了一封包含Perl源代码片段的电子邮件.这是他们在最终直接使用的代码,用于生成预期的令牌.
#!/usr/bin/perl
# Perl Crypt Calamity (here be...something)
use strict;
use CGI;
use MIME::Base64;
use Crypt::TripleDES;
my $cgi = CGI->new(); …Run Code Online (Sandbox Code Playgroud) 我需要为TripleDES加密生成字节数组.我不想使用,.generateKey()因为我需要知道密钥中的字节以将它们传递给另一个应用程序.
感谢回复,但我忘了提一件事:字节必须是奇校验.否则我无法从它们生成TripleDES密钥.我对奇数奇偶校验不是很熟悉,所以我想要创建一个字节检查,如果它有奇数奇偶校验; 然后,如果它确实把它放在数组中,否则不是.
我有一组用来自远程系统的TripleDES编码的加密文档.我需要解码C#中的数据,我无法控制密钥或编码算法.我所拥有的只是密钥和模式(CBC)以及位于文件中的数据.
TripleDESCryptoServiceProvider很容易使用,但我无法弄清楚如何在没有初始化向量的情况下使用Decryptor.
我们有一个24字节(192位)密钥可以解密,但没有别的.
string key = "1468697320656E6372797174696F6E206973737265206933";
byte[] keyData = ParseHex(key); // key is OK at 24 bytes
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Mode = CipherMode.CBC;
des.GenerateIV();
var decryptor = des.CreateDecryptor(keyData,null); // des.IV
var encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");
byte[] output = decryptor.TransformFinalBlock(encoded, 0, encoded.Length);
Run Code Online (Sandbox Code Playgroud)
这与错误的数据完全失败.如果我切换到TransformBlock,代码至少会运行但只产生乱码:
byte[] output = new byte[10000];
var count = decryptor.TransformBlock(encoded, 0, encoded.Length, output, 0);
Run Code Online (Sandbox Code Playgroud)
所以问题是:
事实证明,解码问题不是由丢失的初始化向量引起的,而是由加密数据提供者的错误信息引起的.更新的工作代码如下所示:
// Read the test data
byte[] encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");
// Get the key into …Run Code Online (Sandbox Code Playgroud) 我的加密功能正常工作但是我无法弄清楚如何获得解密功能以提供正确的输出.
这是我的加密功能:
function Encrypt($data, $secret)
{
//Generate a key from a hash
$key = md5(utf8_encode($secret), true);
//Take first 8 bytes of $key and append them to the end of $key.
$key .= substr($key, 0, 8);
//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
return base64_encode($encData);
}
Run Code Online (Sandbox Code Playgroud)
这是我的解密功能:
function Decrypt($data, $secret)
{
$text = base64_decode($data);
$data = mcrypt_decrypt('tripledes', $secret, $text, …Run Code Online (Sandbox Code Playgroud) 根据维基百科,TripleDES支持56,112和168位密钥长度,但System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes表示它只接受128和192位密钥长度.
我正在开发的系统需要可以互操作(我的代码加密的数据需要在PHP,Java和Objective-C中解密),在这种情况下我不是正确的.
那么我应该相信谁呢?我怎样才能确定我的加密数据是否可移植?
我试图使用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) 以下代码在VB中解密字符串:
Public Function Desencriptar(ByVal Input As String) As String
Dim IV() As Byte = ASCIIEncoding.ASCII.GetBytes("abcdefgh")
Dim EncryptionKey() As Byte = Convert.FromBase64String("hereGoesTheKey")
Dim buffer() As Byte = Convert.FromBase64String(Input)
Dim des As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
des.Key = EncryptionKey
des.IV = IV
Return Encoding.UTF8.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length()))
End Function
Run Code Online (Sandbox Code Playgroud)
我想知道如何将此过程复制到移动应用程序服务的PHP脚本中.谢谢.
我有一个使用core1.1的net core应用程序将cript/decript模块从旧的.NET4.6迁移到net core时它就不会工作了
第一个TripleDES不再(以前)支持128位密钥并使用192位密钥修复,尝试更改它会导致错误.
其次,在尝试描述这个字符串时:
/ Tk0ydguv3HauCVUWDK3Tr6U8c9BBaaRwtSt5q4/UHG =
TripleDES使用PKCS7 Padding saing启动错误"指定的填充模式对此算法无效".这很奇怪,因为ti是默认的填充.
我的project.json:
{
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.1.0",
"type": "platform"
},
"Microsoft.AspNetCore.Diagnostics": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.0.1",
"Microsoft.AspNetCore.Razor.Tools": {
"version": "1.0.0-preview2-final",
"type": "build"
},
"Microsoft.AspNetCore.Routing": "1.0.1",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
"Microsoft.AspNetCore.StaticFiles": "1.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
"Microsoft.AspNetCore.Mvc.WebApiCompatShim": "1.0.1",
"Microsoft.AspNetCore.Session": "1.0.0",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
"tools": {
"BundlerMinifier.Core": "2.0.238",
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final",
"Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" …Run Code Online (Sandbox Code Playgroud) tripledes ×10
encryption ×5
php ×4
c# ×2
des ×2
java ×2
3des ×1
aes ×1
asp.net-core ×1
blowfish ×1
coldfusion ×1
cryptography ×1
ecb ×1
md5 ×1
perl ×1
pkcs#7 ×1
vb.net ×1
wikipedia ×1