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.234 second using v1.01-cache-2.11-cpan-4d50c553e7e )