我有一些用Perl编写的加密代码(也是PHP中的一个代码片段)--但是我无法让用VB.NET编写的版本与第三方一起工作。
Perl中的示例
package Sitemaker::API::Crypt;
use warnings;
use strict;
use base qw( Exporter );
use Crypt::CBC;
use MIME::Base64;
our @EXPORT = qw(
encrypt
decrypt
);
=head2 encrypt( $key, $iv, $arg1[,$arg2][,...] )
This encrypts the argumenst (which must all be values, not references) with
the key (which must be 16 characters long)
=cut
sub encrypt {
my ( $key, $iv, @args ) = @_;
my $args = join( '|', @args );
my $cipher = Crypt::CBC->new(
-cipher => 'Rijndael',
-blocksize => 16,
-keysize => 16,
-header => 'none',
-padding => 'standard',
-iv => $iv,
-literal_key => 1,
-key => $key,
);
my $binary_token = $cipher->encrypt( $args );
return encode_base64( $iv . $binary_token );
}
1;PHP中的示例
/**
* @param string $plaintext
* @return string encrypted token
*
* Relies on the Mcrypt module
*/
function encrypt( $plaintext, $apiKey)
{
// Initialize mcrypt module (AES, 128-bit key, CBC)
$handle = mcrypt_module_open( MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $handle ), MCRYPT_DEV_URANDOM );
// PKCS#5 padding
$blocksize = mcrypt_enc_get_block_size( $handle );
$padsize = $blocksize - ( strlen( $plaintext ) % $blocksize );
$plaintext .= str_repeat( chr( $padsize ), $padsize );
// encrypt
mcrypt_generic_init( $handle, $apiKey, $iv );
$ciphertext = mcrypt_generic( $handle, $plaintext );
// clean up
mcrypt_generic_deinit( $handle );
mcrypt_module_close( $handle );
return base64_encode( $iv. $ciphertext );
}因此,我尝试在VB.NET中重新创建相同的内容,但我认为它不起作用,因为我将发布到服务中,只会得到错误信息。VB.NET的加密方法是.
Public Function EncrpytIt(ByVal Key As String, ByVal IV As String, ByVal arrParams As String()) As String
Dim plainTextBytes As Byte()
plainTextBytes = Encoding.ASCII.GetBytes(Join(arrParams, "~"))
Dim outputBytes As Byte()
Dim symmetricKey As New System.Security.Cryptography.RijndaelManaged()
With symmetricKey
.Key = Encoding.ASCII.GetBytes(Key)
.IV = Encoding.ASCII.GetBytes(IV)
.Mode = CipherMode.CBC
.BlockSize = 128
.KeySize = 128
.Padding = PaddingMode.PKCS7
End With
Dim encryptor As ICryptoTransform = symmetricKey.CreateEncryptor(symmetricKey.Key, symmetricKey.IV)
Using msEncrypt As New MemoryStream()
Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
csEncrypt.Write(plainTextBytes, 0, plainTextBytes.Length)
csEncrypt.FlushFinalBlock()
End Using
outputBytes = msEncrypt.ToArray
End Using
Return IV & Convert.ToBase64String(outputBytes)
End Function这是同样的行为,还是我必须改变vb.net代码中的设置?
发布于 2010-10-18 19:22:51
我首先看到的是,在PHP和Perl的情况下,使用加密的数据对级联的IV字符串进行编码,而在VB中则返回IV的级联字符串和加密的基本64编码输出。
您需要将返回语句更改为:
Return Convert.ToBase64String(Encoding.ASCII.GetBytes(IV) & outputBytes)另外,在使用的填充方案之间似乎有一点不一致--至少在PHP和VB.NET版本之间是这样的。基于PHP示例中的注释--即使用PKCS #5和Visual代码使用PKCS #7。我不确定在Perl上下文中“standard”意味着什么。
https://stackoverflow.com/questions/3962520
复制相似问题