OpenSSL编程之AES

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值