在PHP中使用纯文本作为键和IV';s mcrypt
我有一个应用程序,它使用CBC方法在商定的密钥和IV上以三重加密方式在供应商的应用程序之间交换数据。我的应用程序是VB.NET应用程序,而供应商的应用程序是PHP网页。奇怪的是,我似乎无法匹配供应商应用程序的输出 密钥和初始向量以明文形式提供给我们两人。有趣的是,在供应商的应用程序中,他们不会散列或将密钥和IV转换为256位密钥和128位IV。他们只是使用PHP中的mcrypt插件在代码中使用明文格式在PHP中使用纯文本作为键和IV';s mcrypt,php,encryption,mcrypt,tripledes,Php,Encryption,Mcrypt,Tripledes,我有一个应用程序,它使用CBC方法在商定的密钥和IV上以三重加密方式在供应商的应用程序之间交换数据。我的应用程序是VB.NET应用程序,而供应商的应用程序是PHP网页。奇怪的是,我似乎无法匹配供应商应用程序的输出 密钥和初始向量以明文形式提供给我们两人。有趣的是,在供应商的应用程序中,他们不会散列或将密钥和IV转换为256位密钥和128位IV。他们只是使用PHP中的mcrypt插件在代码中使用明文格式 $key = 'plaintextkey'; $iv = 'plaintextIV' $enc
$key = 'plaintextkey';
$iv = 'plaintextIV'
$enc = mcrypt_encrypt(MCRYPT_3DES, $key, $string, MCRYPT_MODE_CBC, $iv)
它产生了一个有趣的文本,比如:
û!‰+«°z0"üÐÑn
û!‰+«z0»Ðñn
我的问题是:
现代密码(保留格式的加密是一个显著的例外)产生的密文应该是安全的。因此,作为密文的一部分,您可能会收到\x01等不可打印字符。要打印密文,则需要使用十六进制或Base 64编码为可打印格式。多亏Artjom的回答提到,需要添加几个0,直到密钥和IV分别达到24和8的长度。下面是VB.NET代码,以防有人需要
Dim byteKey As Byte() = System.Text.Encoding.UTF8.GetBytes("myplaintextkey")
Dim byteVector As Byte() = System.Text.Encoding.UTF8.GetBytes("myplaintextiv")
Dim base64Key As String = Convert.ToBase64String(byteKey)
Dim base64Vector As String = Convert.ToBase64String(byteVector)
Dim key As Byte() = Convert.FromBase64String(base64Key)
Dim iv As Byte() = Convert.FromBase64String(base64Vector)
Dim encryptor As SymmetricEncryptor = New SymmetricEncryptor() 'Note, this an internal library
Try
encryptor.Provider = New System.Security.Cryptography.TripleDESCryptoServiceProvider
encryptor.Encoder = System.Text.Encoding.UTF8
encryptor.Provider.Mode = CipherMode.CBC
encryptor.Provider.Padding = PaddingMode.Zeros
'Add missing zeros to key and IV
If key.Length < 24 Then
Dim i As Integer = key.Length
ReDim Preserve key(23)
While i < 24
key(i) = 0
i += 1
End While
ElseIf key.Length > 24 Then
ReDim Preserve key(23)
End If
If iv.Length < 8 Then
Dim i As Integer = iv.Length
ReDim Preserve iv(8)
While i < 8
iv(i) = 0
i += 1
End While
ElseIf iv.Length > 8 Then
ReDim Preserve iv(8)
End If
encryptor.IV = iv
encryptor.Key = key
Dim output As String = encryptor.Encrypt(output)
Console.Write(output)
Catch ex As Exception
Console.Write(ex.Message)
End Try
Dim byteKey As Byte()=System.Text.Encoding.UTF8.GetBytes(“myplaintextkey”)
Dim byteVector As Byte()=System.Text.Encoding.UTF8.GetBytes(“myplaintextiv”)
Dim base64Key As String=Convert.ToBase64String(byteKey)
Dim base64Vector As String=Convert.ToBase64String(字节向量)
Dim key As Byte()=Convert.FromBase64String(base64Key)
Dim iv As Byte()=Convert.FromBase64String(base64Vector)
Dim encryptor As SymmetricEncryptor=新SymmetricEncryptor()'注意,这是一个内部库
尝试
encryptor.Provider=新System.Security.Cryptography.TripleDESCryptoServiceProvider
encryptor.Encoder=System.Text.Encoding.UTF8
encryptor.Provider.Mode=CipherMode.CBC
encryptor.Provider.Padding=PaddingMode.Zeros
'将缺少的零添加到键和IV
如果键长<24,则
尺寸i为整数=键长度
重拨保留键(23)
而我<24岁
键(i)=0
i+=1
结束时
ElseIf键。那么长度>24
重拨保留键(23)
如果结束
如果iv.长度小于8,则
尺寸i为整数=尺寸iv.长度
雷迪姆保护区四(8)
当我<8
iv(i)=0
i+=1
结束时
ElseIf iv.长度>8那么
雷迪姆保护区四(8)
如果结束
加密机IV=IV
encryptor.Key=密钥
Dim输出为字符串=encryptor.Encrypt(输出)
控制台写入(输出)
特例
控制台写入(例如消息)
结束尝试
我希望它能帮助别人,再次感谢你,Artjom 那么我想他们采取了一种相当简单的方法。试着把他们指向它所建议的正确的做事方式,不管是在一个例子中,还是在对mcrypt的描述中functions@RiggsFolly那么,他们使用钥匙和IV是错误的?我看到,在以前的PHP版本中,他们添加了\0填充,以前的键和IVs填充了“\0”字节,以达到下一个有效大小。因此,如果他们使用的是最新的PHP,它将返回false?哇,这真的很有帮助。简而言之,为了匹配供应商的输出,我必须在键和向量中添加一些零填充,对吗?我想告诉他们mcrypt已经过时了,但我不认为这是我该说的(是的,用0x00字节填充最多24字节的键,并在前8个字节剪切IV应该可以。请记住,mcrypt使用零填充