use Inline C => Config => LIBS => '-lcrypto';
use Inline C;
print base64_encode(encrypt_pass('hello',5);
__END__
__C__
#include <openssl/aes.h>
const unsigned char Key[] = {
...
};
SV* encrypt_pass(unsigned char*pass,int len)
{
AES_KEY AESkey;
unsigned char iv[AES_BLOCK_SIZE];
memset(iv,0,AES_BLOCK_SIZE);
int en_len = (len % 16 ==0)? len: (len / AES_BLOCK_SIZE+1) * AES_BLOCK_SIZE;
AES_set_encrypt_key((const unsigned char *) Key, 128, &AESkey);
unsigned char* cb = (unsigned char*)calloc(en_len,1);
AES_cbc_encrypt((const unsigned char *) &pass[0], &cb[0], len,(const AES_KEY *) &AESkey,iv,AES_ENCRYPT);
SV* rt=newSVpvn(cb,en_len);
free(cb);
return rt;
}
SV* decrypt_pass(unsigned char*pass,int len)
{
AES_KEY AESkey;
unsigned char iv[AES_BLOCK_SIZE];
memset(iv,0,AES_BLOCK_SIZE);
AES_set_decrypt_key((const unsigned char *) Key, 128, &AESkey);
unsigned char* cb = (unsigned char*)calloc(len,1);
AES_cbc_encrypt((const unsigned char *) &pass[0], &cb[0], len,(const AES_KEY *) &AESkey,iv,AES_DECRYPT);
SV* rt=newSVpvn(cb,len);
free(cb);
return rt;
}
转载于:https://my.oschina.net/pikeman/blog/200061