php example <?php $iv = "6543210987654321"; /* 必须16位哦 */ $password="1234567812345678"; $data="12345678901234567890012345678909999999999"; #$enc=aes_encode($data,$password)."\n"; $enc="S3Aqx0GUd3vcz5r6CkCkonPzwfaL3z3BgMtP8aEbzKUNeE+8APZVP02sviaSZXyS"; echo "decode:[".aes_decode($enc,$password)."]\n"; /* 采用128位加密,密钥也必须是16位 */ function aes_encode($sourcestr, $key) { global $iv; return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $sourcestr, MCRYPT_MODE_CBC, $iv)); } function aes_decode($crypttext, $key) { global $iv; return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($crypttext), MCRYPT_MODE_CBC, $iv), "\0"); } ?>
C++ example
string COpenSSL::aes_encode(const char *sourcestr, char *key = "") { if (strcmp(key, "") == 0) { return ""; } int len = strlen(sourcestr); unsigned char iv[AES_BLOCK_SIZE+1] = "6543210987654321"; // 注意,iv绝对不能是const的,否则会段错误 unsigned char * out = (unsigned char *)malloc(1024*1024); if (out == NULL) { fprintf(stderr, "No Memory!\n"); } AES_KEY aes; if(AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) { return NULL; } /* 计算补0后的长度 */ int out_len = ((len - 1) / 16 + 1)* 16; char * sstr = (char *)malloc(sizeof(char) * out_len + 1); /* 补0 */ memset(sstr, 0, out_len+1); strcpy(sstr, sourcestr); AES_cbc_encrypt((unsigned char*)sstr, out, out_len, &aes, (unsigned char*)iv, AES_ENCRYPT); /* 这里的长度一定要注意,不能用strlen来获取,加密后的字符串中可能会包含\0 */ string out2 = base64_encode((char *)out, out_len); free(out); free(sstr); ofstream myfile; myfile.open("aes.txt", ios::out); myfile.write((char *) out2.c_str(), out2.size()); myfile.close(); return out2; } string COpenSSL::aes_decode(const char *crypttext, char *key = "") { if (strcmp(key, "") == 0) { return ""; } int out_len = 0; unsigned char iv[AES_BLOCK_SIZE+1] = "6543210987654321"; string in = base64_decode(crypttext); out_len=in.size(); char *out = (char *) malloc(sizeof(char) * out_len + 1); memset(out, 0, out_len + 1); AES_KEY aes; if(AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0) { return ""; } AES_cbc_encrypt((unsigned char*)in.c_str(), (unsigned char*)out, out_len, &aes, (unsigned char*)iv, AES_DECRYPT); //free(in); string sRet=out; free(out); return sRet; } bool COpenSSL::testAES(std::string p_sKey, std::string p_sData2Encrypt, bool p_bEnc, std::string & p_sEncStr) { /* * aes BLOCK HAVE TO BE 16 BIT BLOCK * AES key has to be 16 CHAR */ std::string sBuffer, sOutBuffer; //std::string sKey="1234567812345678"; unsigned char aes_key[16]; //128 bit memset(aes_key, 0, 16); int nKeyLen = p_sKey.size() <= 16 ? p_sKey.size() : 16; memcpy(aes_key, p_sKey.c_str(), nKeyLen); //Get password inplace /* Buffers for Encryption and Decryption */ unsigned char databuffer[16]; memset(databuffer, 0, 16); unsigned char outbuffer[16]; memset(outbuffer, 0, 16); /* AES-128 bit CBC Encryption */ AES_KEY enc_key, dec_key; if (p_bEnc) { if (AES_set_encrypt_key(aes_key, sizeof(aes_key) * 8, &enc_key) < 0) { return false; } } else { if (AES_set_decrypt_key(aes_key, sizeof(aes_key) * 8, &dec_key) < 0) { return false; } } int32_t nDataLen = 0; if (p_bEnc) { nDataLen = p_sData2Encrypt.size(); sBuffer.append((char *) &nDataLen, sizeof(int32_t)); sBuffer.append(p_sData2Encrypt); int nMod = sBuffer.size() % 16; if (nMod != 0) { sBuffer.append((char *) databuffer, 16 - nMod); } } else { sBuffer = base64_decode(p_sData2Encrypt); nDataLen = sBuffer.size(); if (nDataLen % 16 != 0) { TRACE("Wrong Buffer, Len mod 16 has to be 0\n"); return false; } } int nDataIndex = 0; int nCopySize = 16; nDataLen = sBuffer.size(); //AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits while (nDataIndex < nDataLen) { memcpy(databuffer, sBuffer.c_str() + nDataIndex, nCopySize); if (p_bEnc) { AES_ecb_encrypt(databuffer, outbuffer, &enc_key, AES_ENCRYPT); } else { AES_ecb_encrypt(databuffer, outbuffer, &dec_key, AES_DECRYPT); } nDataIndex += 16; sOutBuffer.append((char *) outbuffer, 16); } if (p_bEnc) { p_sEncStr = base64_encode((unsigned char *) sOutBuffer.c_str(), sOutBuffer.size()); } else { int32_t nTotalLen = 0; memcpy((char *) &nTotalLen, sOutBuffer.c_str(), sizeof(int32_t)); p_sEncStr.append(sOutBuffer.c_str() + sizeof(int32_t), nTotalLen); } return true; }