Net-IPMessenger

 view release on metacpan or  search on metacpan

lib/Net/IPMessenger/Encrypt.pm  view on Meta::CPAN

package Net::IPMessenger::Encrypt;

use warnings;
use strict;
use Net::IPMessenger::EncryptOption;
use base qw( Class::Accessor::Fast );

__PACKAGE__->mk_accessors(
    qw( exponent modulus private_key
        support_encryption attach )
);

my $RSA_KEY_SIZE = 1024;
my $IV           = "\0\0\0\0\0\0\0\0";

sub new {
    my $class = shift;
    my %args  = @_;
    # needs those modules for encryption support

lib/Net/IPMessenger/Encrypt.pm  view on Meta::CPAN

}

sub option {
    my $self = shift;
    return Net::IPMessenger::EncryptOption->new(shift);
}

sub generate_keys {
    my $self = shift;

    if ( $self->private_key ) {
        return ( $self->exponent, $self->modulus );
    }

    my $rsa_key_size;
    my $option = $self->support_encryption;
    if ( $option->get_rsa_2048 ) {
        $rsa_key_size = 2048;
    }
    elsif ( $option->get_rsa_1024 ) {
        $rsa_key_size = 1024;
    }
    elsif ( $option->get_rsa_512 ) {
        $rsa_key_size = 512;
    }

    my $rsa = Crypt::OpenSSL::RSA->generate_key($rsa_key_size);
    my( $modulus, $exponent ) = $rsa->get_key_parameters;

    $self->private_key( $rsa->get_private_key_string );
    return (
        $self->exponent( $exponent->to_hex ),
        $self->modulus( $modulus->to_hex )
    );
}

sub public_key_string {
    my $self = shift;

    my( $exponent, $modulus ) = $self->generate_keys;

lib/Net/IPMessenger/Encrypt.pm  view on Meta::CPAN

    # encrypt key and message
    my $cipher_key  = $rsa_pub->encrypt($shared_key);
    my $cipher_text = $blowfish->encrypt($message);

    return sprintf "%s:%s:%s", $pubkey->{option}, unpack( "H*", $cipher_key ),
        unpack( "H*", $cipher_text );
}

sub decrypt_message {
    my( $self, $message ) = @_;
    return $message unless defined $self->private_key;

    my( $enc_opt, $cipher_key, $cipher_text ) = split /\:/, $message, 3;
    my $rsa = Crypt::OpenSSL::RSA->new_private_key( $self->private_key );
    $rsa->use_pkcs1_padding;
    my $shared_key = $rsa->decrypt( pack( "H*", $cipher_key ) );
    my $blowfish = Crypt::CBC->new(
        -literal_key => 1,
        -key         => $shared_key,
        -keysize     => length $shared_key,
        -cipher      => 'Blowfish',
        -padding     => 'standard',
        -iv          => $IV,
        -header      => 'none',



( run in 0.345 second using v1.01-cache-2.11-cpan-a5abf4f5562 )