in reply to Re^2: Rewriting a C# Encryption Function
in thread Rewriting a C# Encryption Function

I note that the bytes which the C# is taking the SHA1 of are little-endian UTF-16:

// s = '1234' .... byte[] bytes = Encoding.Unicode.GetBytes(s); // bytes = 49, 0, 50, 0, 51, 0, 52, 0
so you're probably best off:
my $data = encode("UTF-16LE", .....);
On my x86 (little-endian) machine
my $data = encode("UTF-16", '1234');
gives $data bytes:
0xFE 0xFF 0x00 0x31 0x00 0x32 0x00 0x33 0x00 0x34
which is big-endian complete with BOM. Whereas:
my $data = encode("UTF-16LE", '1234');
gives $data bytes:
0x31 0x00 0x32 0x00 0x33 0x00 0x34 0x00
which is little-endian sans BOM; which appears to be what's required.

Replies are listed 'Best First'.
Re^4: Rewriting a C# Encryption Function
by bkiahg (Pilgrim) on Aug 25, 2008 at 14:26 UTC
    You are the man!

    Thank you guys for helping me solve this, below is the code that does exactly what I was looking for.
    use strict; use MIME::Base64; use Digest::SHA1 qw(sha1 sha1_hex sha1_base64); use Encode qw/encode decode/; my $data = encode("UTF-16LE", '1234'); $data = sha1($data); print encode_base64($data) . "\n";