vb与php通讯加密,在VB.NET中加密和在PHP中解密

由于没有人能够提供功能齐全的BI-DIRECTIONAL解决方案,我已经冒昧地在本文中为社区提供了一个解决方案.

问题是,PHP不符合标准,强制填充字符串以便匹配.目前,如果在.NET和PHP之间随机生成,没有已知的方法可靠地传递IV(如果你确实发现了如何或者这种变化,请随时修改它).

以下是使用Triple DES加密数据的COMPLETE解决方案,其方式与.NET和PHP兼容,允许双向三重DES加密通信.此方法也与Java,Delphi,Objective-C和许多其他语言兼容,但此类代码不会在此处提供,因为这不是已发布问题的解决方案.

VB.NET Triple DES Class

Imports System

Imports System.Text

Imports System.IO

Imports System.Security.Cryptography

Public Class TripleDES

Private bPassword As Byte()

Private sPassword As String

Public Sub New(Optional ByVal Password As String = "password")

' On Class Begin

Me.Password = Password

End Sub

Public ReadOnly Property PasswordHash As String

Get

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Return UTF8.GetString(bPassword)

End Get

End Property

Public Property Password() As String

Get

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Return sPassword

End Get

Set(value As String)

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Dim HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

bPassword = HashProvider.ComputeHash(UTF8.GetBytes(value))

sPassword = value

End Set

End Property

#Region "Encrypt"

' Encrypt using Password from Property Set (pre-hashed)

Public Function Encrypt(ByVal Message As String) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = bPassword

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)

Try

Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor

Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)

Finally

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

Return Convert.ToBase64String(Results)

End Function

' Encrypt using Password as byte array

Private Function Encrypt(ByVal Message As String, ByVal Password() As Byte) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(UTF8.GetString(Password)))

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)

Try

Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor

Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)

Finally

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

Return Convert.ToBase64String(Results)

End Function

' Encrypt using Password as string

Public Function Encrypt(ByVal Message As String, ByVal Password As String) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

' Step 1. We hash the Passphrase using MD5

' We use the MD5 hash generator as the result is a 128 bit byte array

' which is a valid length for the Triple DES encoder we use below

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(Password))

' Step 2. Create a new TripleDESCryptoServiceProvider object

' Step 3. Setup the encoder

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

' Step 4. Convert the input string to a byte[]

Dim DataToEncrypt() As Byte = UTF8.GetBytes(Message)

' Step 5. Attempt to encrypt the string

Try

Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor

Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)

Finally

' Clear the Triple Des and Hashprovider services of any sensitive information

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

' Step 6. Return the encrypted string as a base64 encoded string

Return Convert.ToBase64String(Results)

End Function

#End Region

#Region "Decrypt"

' Decrypt using Password from Property (pre-hashed)

Public Function Decrypt(ByVal Message As String) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = Me.bPassword

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)

Try

Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor

Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)

Finally

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

Return UTF8.GetString(Results)

End Function

' Decrypt using Password as Byte array

Public Function Decrypt(ByVal Message As String, ByVal Password() As Byte) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(UTF8.GetString(Password)))

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)

Try

Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor

Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)

Finally

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

Return UTF8.GetString(Results)

End Function

' Decrypt using Password as string

Public Function Decrypt(ByVal Message As String, ByVal Password As String) As String

Dim Results() As Byte

Dim UTF8 As System.Text.UTF8Encoding = New System.Text.UTF8Encoding

' Step 1. We hash the pass phrase using MD5

' We use the MD5 hash generator as the result is a 128-bit byte array

' which is a valid length for the Triple DES encoder we use below

Using HashProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()

Dim TDESKey() As Byte = HashProvider.ComputeHash(UTF8.GetBytes(Password))

' Step 2. Create a new TripleDESCryptoServiceProvider object

' Step 3. Setup the decoder

Using TDESAlgorithm As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider() With {.Key = TDESKey, .Mode = CipherMode.ECB, .Padding = PaddingMode.PKCS7}

' Step 4. Convert the input string to a byte[]

Dim DataToDecrypt() As Byte = Convert.FromBase64String(Message)

' Step 5. Attempt to decrypt the string

Try

Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor

Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)

Finally

' Clear the Triple Des and Hash provider services of any sensitive information

TDESAlgorithm.Clear()

HashProvider.Clear()

End Try

End Using

End Using

' Step 6. Return the decrypted string in UTF8 format

Return UTF8.GetString(Results)

End Function

#End Region

End Class

VB.NET Triple DES类用法

Dim tdes As New TripleDES("12345")

Dim vbEncrypted = tdes.Encrypt("Encrypted using VB.NET")

Dim phpEncrypted = "5Ittyr0+jiI7QQmPrvSVnMc9MEWQCjAN"

Debug.Print("PHP Encrypted: " & phpEncrypted)

Debug.Print("VB Encrypted: " & vbEncrypted)

Debug.Print("PHP Encrypted (decrypted result): " & tdes.Decrypt(phpEncrypted))

Debug.Print("VB Encrypted (decrypted result): " & tdes.Decrypt(vbEncrypted))

PHP三重DES类

class TripleDES {

private $bPassword;

private $sPassword;

function __construct($Password) {

$this->bPassword = md5(utf8_encode($Password),TRUE);

$this->bPassword .= substr($this->bPassword,0,8);

$this->sPassword - $Password;

}

function Password($Password = "") {

if($Password == "") {

return $this->sPassword;

} else {

$this->bPassword = md5(utf8_encode($Password),TRUE);

$this->bPassword .= substr($this->bPassword,0,8);

$this->sPassword - $Password;

}

}

function PasswordHash() {

return $this->bPassword;

}

function Encrypt($Message, $Password = "") {

if($Password <> "") { $this->Password($Password); }

$size=mcrypt_get_block_size('tripledes','ecb');

$padding=$size-((strlen($Message)) % $size);

$Message .= str_repeat(chr($padding),$padding);

$encrypt = mcrypt_encrypt('tripledes',$this->bPassword,$Message,'ecb');

return base64_encode($encrypt);

}

function Decrypt($message, $Password = "") {

if($Password <> "") { $this->Password($Password); }

return trim(mcrypt_decrypt('tripledes', $this->bPassword, base64_decode($message), 'ecb'), ord(2));

}

}

PHP Triple DES类用法

$tdes = new TripleDES("12345");

$phpEncrypted = $tdes->encrypt("Encrypted using PHP");

$vbEncrypted = "5Ittyr0+jiI7QQmPrvSVnP3s2CeoTJmF"; // Encrypted using VB.NET

echo "PHP Encrypted: " . $phpEncrypted . '
';

echo "VB Encrypted: " . $vbEncrypted . '
';

echo "PHP Encrypted (decrypted result): " . $tdes->Decrypt($phpEncrypted) . '
';

echo "VB Encrypted (decrypted result): " . $tdes->Decrypt($vbEncrypted) . '
';

我尽我所能使两个类的可用性水平相同,因为语言自然允许.由于PHP不允许重载函数,我不得不使用密码作为可选参数,这是一个字符串值. VB.NET解决方案有一个额外的覆盖,允许您在加密/解密函数上传递密码字符串的字节值.提供示例代码以显示每个的用法,显示了实例化对象的最简单形式,两个类都允许在对象创建时设置密码.

对于其他任何人都在抨击他们的大脑试图找到一个三重DES的工作双向解决方案(并且不想被强制进入每个人似乎指向的方框 – Rijndael),那么这个解决方案是为你,你可以不停地撞到墙上.

添加了VB.NET TripleDES类的C#转换

C#类(已添加[2017-01-11])

using System;

using System.Security.Cryptography;

public class TripleDES {

private byte[] bPassword;

private string sPassword;

public TripleDES( string Password = "password" ) {

// On Class Begin

this.Password = Password;

}

public string PasswordHash {

get {

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

return UTF8.GetString( bPassword );

}

}

public string Password {

get {

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

return sPassword;

}

set {

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();

bPassword = HashProvider.ComputeHash( UTF8.GetBytes( value ) );

sPassword = value;

}

}

#region "Encrypt"

// Encrypt using Password from Property Set (pre-hashed)

public string Encrypt( string Message ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = bPassword;

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

byte[] DataToEncrypt = UTF8.GetBytes( Message );

try {

ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();

Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );

} finally {

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

return Convert.ToBase64String( Results );

}

// Encrypt using Password as byte array

private string Encrypt( string Message, byte[] Password ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( UTF8.GetString( Password ) ) );

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

byte[] DataToEncrypt = UTF8.GetBytes( Message );

try {

ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();

Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );

} finally {

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

return Convert.ToBase64String( Results );

}

// Encrypt using Password as string

public string Encrypt( string Message, string Password ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

// Step 1. We hash the Passphrase using MD5

// We use the MD5 hash generator as the result is a 128 bit byte array

// which is a valid length for the Triple DES encoder we use below

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( Password ) );

// Step 2. Create a new TripleDESCryptoServiceProvider object

// Step 3. Setup the encoder

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

// Step 4. Convert the input string to a byte[]

byte[] DataToEncrypt = UTF8.GetBytes( Message );

// Step 5. Attempt to encrypt the string

try {

ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();

Results = Encryptor.TransformFinalBlock( DataToEncrypt, 0, DataToEncrypt.Length );

} finally {

// Clear the Triple Des and Hashprovider services of any sensitive information

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

// Step 6. Return the encrypted string as a base64 encoded string

return Convert.ToBase64String( Results );

}

#endregion

#region "Decrypt"

// Decrypt using Password from Property (pre-hashed)

public string Decrypt( string Message ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = this.bPassword;

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

byte[] DataToDecrypt = Convert.FromBase64String( Message );

try {

ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();

Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );

} finally {

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

return UTF8.GetString( Results );

}

// Decrypt using Password as Byte array

public string Decrypt( string Message, byte[] Password ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( UTF8.GetString( Password ) ) );

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

byte[] DataToDecrypt = Convert.FromBase64String( Message );

try {

ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();

Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );

} finally {

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

return UTF8.GetString( Results );

}

// Decrypt using Password as string

public string Decrypt( string Message, string Password ) {

byte[] Results = null;

System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();

// Step 1. We hash the pass phrase using MD5

// We use the MD5 hash generator as the result is a 128-bit byte array

// which is a valid length for the Triple DES encoder we use below

using ( MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider() ) {

byte[] TDESKey = HashProvider.ComputeHash( UTF8.GetBytes( Password ) );

// Step 2. Create a new TripleDESCryptoServiceProvider object

// Step 3. Setup the decoder

using ( TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider { Key = TDESKey, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 } ) {

// Step 4. Convert the input string to a byte[]

byte[] DataToDecrypt = Convert.FromBase64String( Message );

// Step 5. Attempt to decrypt the string

try {

ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();

Results = Decryptor.TransformFinalBlock( DataToDecrypt, 0, DataToDecrypt.Length );

} finally {

// Clear the Triple Des and Hash provider services of any sensitive information

TDESAlgorithm.Clear();

HashProvider.Clear();

}

}

}

// Step 6. Return the decrypted string in UTF8 format

return UTF8.GetString( Results );

}

#endregion

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值