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;
}


你可能感兴趣的:(OpenSSL编程之AES)