【问题标题】:PHP Encryption & VB.net DecryptionPHP 加密 & VB.net 解密
【发布时间】:2010-11-19 17:19:35
【问题描述】:

我正在尝试做一个简单的任务。在 PHP 中加密一个值并在我的 VB.net 应用程序中解密它。 我想我会使用 TripleDES 或 Rijdael 128 或 256

虽然这应该很简单。谁能指出我正确的方向?

谢谢

【问题讨论】:

标签: php vb.net encryption rijndael


【解决方案1】:

我也一直在努力寻找解决这个问题的方法。这是 php 和 vb.net 的完整代码集,可以满足您的需求。也应该很容易翻译成 C#。

########################################
# BEGIN PHP CODE
########################################


<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

// I blantantly stole, tweaked and happily used this code from: 
// Lord of Ports http://www.experts-exchange.com/M_1736399.html


$ky = 'lkirwf897+22#bbtrm8814z5qq=498j5'; // 32 * 8 = 256 bit key
$iv = '741952hheeyy66#cs!9hjv887mxx7@8y'; // 32 * 8 = 256 bit iv

$text = "Here is my data to encrypt!!!";

$from_vb = "QBlgcQ2+v3wd8RLjhtu07ZBd8aQWjPMfTc/73TPzlyA=";   // enter value from vb.net app here to test

$etext = encryptRJ256($ky, $iv, $text);
$dtext = decryptRJ256($ky, $iv, $etext);
$vtext = decryptRJ256($ky, $iv, $from_vb);

echo "<HR>orignal string: $text";
echo "<HR>encrypted in php: $etext";
echo "<HR>decrypted in php: $dtext";
echo "<HR>encrypted in vb: $from_vb";
echo "<HR>from vb decrypted in php: $vtext"; 
echo "<HR>If you like it say thanks! richard dot varno at gmail dot com";


exit;



function decryptRJ256($key,$iv,$string_to_decrypt)
{

    $string_to_decrypt = base64_decode($string_to_decrypt);

    $rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_decrypt, MCRYPT_MODE_CBC, $iv);

    $rtn = rtrim($rtn, "\0\4");

    return($rtn);

}


function encryptRJ256($key,$iv,$string_to_encrypt)
{

    $rtn = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_encrypt, MCRYPT_MODE_CBC, $iv);

    $rtn = base64_encode($rtn);

    return($rtn);

}    

?>

########################################
# END PHP CODE
########################################



########################################
# BEGIN VB.NET CODE (console app)
########################################

Imports System
Imports System.Text
Imports System.Security.Cryptography
Imports System.IO

Module Module1

    ' I blantantly stole, tweaked and happily used this code from: 
    ' Lord of Ports http://www.experts-exchange.com/M_1736399.html

    Sub Main()

        'Shared 256 bit Key and IV here
        Dim sKy As String = "lkirwf897+22#bbtrm8814z5qq=498j5"  '32 chr shared ascii string (32 * 8 = 256 bit)
        Dim sIV As String = "741952hheeyy66#cs!9hjv887mxx7@8y"  '32 chr shared ascii string (32 * 8 = 256 bit)

        Dim sTextVal As String = "Here is my data to encrypt!!!"

        Dim eText As String
        Dim dText As String

        eText = EncryptRJ256(sKy, sIV, sTextVal)
        dText = DecryptRJ256(sKy, sIV, eText)

        Console.WriteLine("key: " & sKy)
        Console.WriteLine()
        Console.WriteLine(" iv: " & sIV)
        Console.WriteLine("txt: " & sTextVal)
        Console.WriteLine("encrypted: " & eText)
        Console.WriteLine("decrypted: " & dText)
        Console.WriteLine("If you like it say thanks! richard dot varno at gmail dot com")
        Console.WriteLine("press any key to exit")
        Console.ReadKey(True)

    End Sub

    Public Function DecryptRJ256(ByVal prm_key As String, ByVal prm_iv As String, ByVal prm_text_to_decrypt As String)

        Dim sEncryptedString As String = prm_text_to_decrypt

        Dim myRijndael As New RijndaelManaged
        myRijndael.Padding = PaddingMode.Zeros
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 256
        myRijndael.BlockSize = 256

        Dim key() As Byte
        Dim IV() As Byte

        key = System.Text.Encoding.ASCII.GetBytes(prm_key)
        IV = System.Text.Encoding.ASCII.GetBytes(prm_iv)

        Dim decryptor As ICryptoTransform = myRijndael.CreateDecryptor(key, IV)

        Dim sEncrypted As Byte() = Convert.FromBase64String(sEncryptedString)

        Dim fromEncrypt() As Byte = New Byte(sEncrypted.Length) {}

        Dim msDecrypt As New MemoryStream(sEncrypted)
        Dim csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

        csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length)

        Return (System.Text.Encoding.ASCII.GetString(fromEncrypt))

    End Function


    Public Function EncryptRJ256(ByVal prm_key As String, ByVal prm_iv As String, ByVal prm_text_to_encrypt As String)

        Dim sToEncrypt As String = prm_text_to_encrypt

        Dim myRijndael As New RijndaelManaged
        myRijndael.Padding = PaddingMode.Zeros
        myRijndael.Mode = CipherMode.CBC
        myRijndael.KeySize = 256
        myRijndael.BlockSize = 256

        Dim encrypted() As Byte
        Dim toEncrypt() As Byte
        Dim key() As Byte
        Dim IV() As Byte

        key = System.Text.Encoding.ASCII.GetBytes(prm_key)
        IV = System.Text.Encoding.ASCII.GetBytes(prm_iv)

        Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV)

        Dim msEncrypt As New MemoryStream()
        Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

        toEncrypt = System.Text.Encoding.ASCII.GetBytes(sToEncrypt)

        csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)
        csEncrypt.FlushFinalBlock()

        encrypted = msEncrypt.ToArray()

        Return (Convert.ToBase64String(encrypted))

    End Function

End Module

########################################
# END VB.NET CODE
########################################

【讨论】:

  • 哇,谢谢,我必须在下一个应用程序中测试这个。谢谢!
  • 只是想说声谢谢,我一直在寻找我们的代码并使用了您的代码。不过,我已经将 VB 转换为 C#。
  • @Vural Acar 请你说明为什么它不能总是工作的原因
  • 你救了我的命,伙计@RichardVarno
  • @Richard Varno 谢谢。我正在使用多平台 VB.NET、PHP 和 Android。我也可以在 android/java 中使用这种加密/解密吗?
【解决方案2】:

我们有一些密码在 .NET 上的 C# 和 PHP 之间工作。我不熟悉 VB.net。我假设它使用相同的加密库System.Security.Cryptography

在 PHP 方面,我们从 mcrypt 切换到 OpenSSL,因为 mcrypt 不支持某些模式和填充。

只要您使用相同的算法(DES、AES 等)、相同的模式(CBC、ECB 等)、相同的填充(PKCS1、PKCS5),密码就应该适用于两个平台。

使用 mcrypt 在 PHP 端使用 AES-128 进行加密的示例,

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128);
    $data = $this->paddingAlgorithm->padData($data, $blockSize);
    return $iv . mcrypt_encrypt($this->MCRYPT_DES, $keyBytes, $data, MCRYPT_MODE_CBC, $iv);

请注意,我们使用 PKCS7 填充,但 mcrypt 不支持它,因此我们必须编写填充算法。我们还将 IV(初始向量)添加到密文中。你可以将它存储在其他地方,但你需要它来解密。

这里是相应的 C# 代码来设置要解密的密码,

    // create the underlying symmetric algorithm with the given name
    algorithm = (SymmetricAlgorithm)CryptoConfig.CreateFromName("RIJNDAEL");
    // set cipher mode
    algorithm.Mode = CipherMode.CBC;
    // set padding mode
    algorithm.Padding = PaddingMode.PKCS7;

【讨论】:

  • 您能否提供更多关于 PHP 方面的详细信息?你在 C# 方面做了什么?你有任何代码sn-ps可以分享吗?谢谢!
  • 代码不在公共领域,所以我不能分享。我发布了一些 sn-ps 来向您展示参数如何在两端匹配。 PHP 代码来自使用 mcrypt 的旧版本,它不支持 PKCS7 填充。所以如果你使用mcrypt,你必须编写填充函数。一旦你了解了算法,这真的很简单。
  • 感谢您摆姿势。我现在正在尝试。
【解决方案3】:

对于 PHP,您应该查看 mcrypt extension,它应该支持您指定的所有密码

【讨论】:

  • 我的 php 代码使用 mcrypt。我遇到的问题是在 VB.net 中对其进行解码
【解决方案4】:

免责声明:我从未真正在 .NET 中使用过 Crytography 类。

要在 .NET 中进行 Rijndael 解密,您可能正在寻找 System.Security.Cryptography.RijndaelManaged 类。

该页面也有一些如何使用它的示例,尽管您可能还需要一个 RSACryptoServiceProvider 的实例...我不确定。

【讨论】:

  • 我正在查看您发布的第一个链接。看起来可以,只是需要弄清楚。谢谢。
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2012-05-15
  • 2018-01-20
  • 2017-08-12
  • 2018-12-04
  • 2013-03-16
相关资源
最近更新 更多