Skip to content

timlegge/perl-Crypt-OpenSSL-AES

 
 

Repository files navigation

NAME

Crypt::OpenSSL::AES - A Perl wrapper around OpenSSL's AES library

SYNOPSIS

 use Crypt::OpenSSL::AES;

 my $cipher = Crypt::OpenSSL::AES->new($key);

 or

 # Pick better keys and iv...
 my $key = pack("H*", substr(sha512_256_hex(rand(1000)), 0, ($ks/4)));
 my $iv  = pack("H*", substr(sha512_256_hex(rand(1000)), 0, 32));
 my $cipher = Crypt::OpenSSL::AES->new(
                                        $key,
                                        {
                                            cipher => 'AES-256-CBC',
                                            iv      => $iv, (16-bytes for supported ciphers)
                                            padding => 1, (0 - no padding, 1 - padding)
                                        }
                                    );

 $encrypted = $cipher->encrypt($plaintext);
 $decrypted = $cipher->decrypt($encrypted);

DESCRIPTION

This module implements a wrapper around OpenSSL. Specifically, it wraps the methods related to the US Government's Advanced Encryption Standard (the Rijndael algorithm). The original version supports only AES 256 ECB (electronic codebook mode encryption).

This module is compatible with Crypt::CBC (and likely other modules that utilize a block cipher to make a stream cipher).

This module is an alternative to the implementation provided by Crypt::Rijndael which implements AES itself. In contrast, this module is simply a wrapper around the OpenSSL library.

As of version 0.09 additional AES ciphers are supported. Those are:

  • AES-128-ECB, AES-192-ECB and AES-256-ECB (no IV)

    Supports padding

  • AES-128-CBC, AES-192-CBC and AES-256-CBC

    Supports padding and iv

  • AES-128-CFB, AES-192-CFB and AES-256-CFB

    Supports padding and iv

  • AES-128-CTR, AES-192-CTR and AES-256-CTR

    Supports padding and iv

  • AES-128-OFB, AES-192-OFB and AES-256-OFB

    Supports padding and iv

  • new()

    For compatibility with old versions you can simply pass the key to the new constructor.

    my $cipher = Crypt::OpenSSL::AES->new($key);
    
    or
    
    my $cipher = Crypt::OpenSSL::AES->new($key,
                    {
                        cipher  => 'AES-256-CBC',
                        iv      => $iv, (16-bytes for supported ciphers)
                        padding => 1, (0 - no padding, 1 - padding)
                    });
    
    # cipher
    #   AES-128-ECB, AES-192-ECB and AES-256-ECB (no IV)
    #   AES-128-CBC, AES-192-CBC and AES-256-CBC
    #   AES-128-CFB, AES-192-CFB and AES-256-CFB
    #   AES-128-CTR, AES-192-CTR and AES-256-CTR
    #   AES-128-OFB, AES-192-OFB and AES-256-OFB
    #
    # iv - 16-byte random data
    #
    # padding
    #   0 - no padding
    #   1 - padding
  • $cipher->encrypt($data)

    Encrypt data. The size of $data must be exactly blocksize in length (16 bytes), otherwise this function will croak.

    You should use Crypt::CBC or something similar to encrypt/decrypt data of arbitrary lengths.

  • $cipher->decrypt($data)

    Decrypts $data. The size of $data must be exactly blocksize in length (16 bytes), otherwise this function will croak.

    You should use Crypt::CBC or something similar to encrypt/decrypt data of arbitrary lengths.

  • keysize

    This method is used by Crypt::CBC to verify the key length. This module actually supports key lengths of 16, 24, and 32 bytes, but this method always returns 32 for Crypt::CBC's sake.

  • blocksize

    This method is used by Crypt::CBC to check the block size. The blocksize for AES is always 16 bytes.

USE WITH CRYPT::CBC

    use Crypt::CBC;

    my $plaintext = "This is a test!!";
    my $password = "qwerty123";
    my $cipher = Crypt::CBC->new(
            -key    => $password,
            -cipher => "Crypt::OpenSSL::AES",
            -pbkdf  => 'pbkdf2',
    );

    my $encrypted = $cipher->encrypt($plaintext);
    my $decrypted = $cipher->decrypt($encrypted);

SEE ALSO

Crypt::CBC

http://www.openssl.org/

http://en.wikipedia.org/wiki/Advanced\_Encryption\_Standard

http://www.csrc.nist.gov/encryption/aes/

BUGS

Need more (and better) test cases.

AUTHOR

Tolga Tarhan, <cpan at ttar dot org>

The US Government's Advanced Encryption Standard is the Rijndael Algorithm and was developed by Vincent Rijmen and Joan Daemen.

COPYRIGHT AND LICENSE

Copyright (C) 2006 - 2023 DelTel, Inc.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.5 or, at your option, any later version of Perl 5 you may have available.

Releases

No releases published

Packages

No packages published

Languages

  • Perl 85.9%
  • XS 14.1%