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

Getting closer to this. I think the problem I'm facing right now is in the Encoding to Unicode:
use strict; use MIME::Base64; use Digest::SHA1 qw/sha1 sha1_hex sha1_base64/; use Encode qw/encode decode/; my $data = encode("UTF-16", 1234); $data = sha1($data); print encode_base64($data) . "\n";

Replies are listed 'Best First'.
Re^3: Rewriting a C# Encryption Function
by gone2015 (Deacon) on Aug 22, 2008 at 23:35 UTC

    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.

      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";