加密和解密字符串。

在项目中遇到需要加密URL中一个参数,碰过过一些问题。

在网上看到两个函数。

//加密。$key为自己任意设定的一个字符(数字,字母),$plain_text为需要加密的字符串。
function encrypt($key, $plain_text) {
    $plain_text = trim($plain_text);
    $iv = substr(md5($key), 0,mcrypt_get_iv_size(MCRYPT_CAST_256,MCRYPT_MODE_CFB));
    $c_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $plain_text, MCRYPT_ENCRYPT, $iv);
    return trim(chop(base64_encode($c_t)));
}

//解密。$key同上,自己设定加密的key,$c_t 为经过encrypt加密过的字符串,返回的为加密前的字符串。
function decrypt($key, $c_t) {
    $c_t = trim(chop(base64_decode($c_t)));
    $iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
    $p_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $c_t, MCRYPT_DECRYPT, $iv);
    return trim(chop($p_t));
}

可以用上面两个函数能够较安全的加密和解密。

注意一:如果,也像我一样,加密的字符串需要经过URL经过GET的方式传到php页面。需要把加密后的字符串使用urlencode转码一下:

callback.php?uid='.urlencode(encrypt("timerchina",$_PG['uid'])).'&loginname='.urlencode(encrypt("timerchina",$_PG['loginname']))

但是在callback.php不需要使用 urldecode解编码,因为浏览器已经自动的解码了,不然会出问题的。

像下面这样,就可以了。

$uid = decrypt('timerchina',$_PG["uid"]);

$_SESSION['loginName'] = decrypt('timerchina',$_PG["loginname"]);

注意二:$key的值的设定和需要加密的字符串,,有时候容易出现加密后无法解密的问题。

比如$key为 "timer",$plain_text为z开头的字符串。比如:zero123、会出现加密后无法解密的问题,具体原因不清楚。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 AES 加密解密字符串的示例代码: ```c++ #include <iostream> #include <string> #include <openssl/aes.h> #include <cstring> using namespace std; string encrypt(string str, string key) { AES_KEY aesKey; if (AES_set_encrypt_key((unsigned char*)key.c_str(), 128, &aesKey) != 0) { cout << "AES set encrypt key error" << endl; return ""; } size_t len = str.length(); unsigned char* input = (unsigned char*)str.c_str(); int padding = AES_BLOCK_SIZE - len % AES_BLOCK_SIZE; len += padding; unsigned char* paddedInput = new unsigned char [len + 1]; memcpy(paddedInput, input, str.length()); for (int i = str.length(); i < len; i++) { paddedInput[i] = (unsigned char)padding; } paddedInput[len] = '\0'; unsigned char* output = new unsigned char [len + 1]; memset(output, 0, len + 1); AES_encrypt(paddedInput, output, &aesKey); string encryptedStr((char*)output, len); delete [] paddedInput; delete [] output; return encryptedStr; } string decrypt(string encryptedStr, string key) { AES_KEY aesKey; if (AES_set_decrypt_key((unsigned char*)key.c_str(), 128, &aesKey) != 0) { cout << "AES set decrypt key error" << endl; return ""; } size_t len = encryptedStr.length(); unsigned char* input = (unsigned char*)encryptedStr.c_str(); unsigned char* output = new unsigned char [len + 1]; memset(output, 0, len + 1); AES_decrypt(input, output, &aesKey); int padding = output[len - 1]; int decryptedLen = len - padding; string decryptedStr((char*)output, decryptedLen); delete [] output; return decryptedStr; } int main() { string str = "Hello World!"; string key = "mykey"; string encryptedStr = encrypt(str, key); cout << "加密后的字符串:" << encryptedStr << endl; string decryptedStr = decrypt(encryptedStr, key); cout << "解密后的字符串:" << decryptedStr << endl; return 0; } ``` 该示例代码使用了 OpenSSL 库中的 AES 加密算法对字符串进行加密解密。其中,`encrypt` 函数接收一个字符串和一个密钥,返回加密后的字符串;`decrypt` 函数接收一个加密后的字符串和一个密钥,返回解密后的字符串。 在加密过程中,先使用 `AES_set_encrypt_key` 函数设置加密密钥,然后对字符串进行填充,再使用 `AES_encrypt` 函数进行加密操作。在解密过程中,先使用 `AES_set_decrypt_key` 函数设置解密密钥,然后使用 `AES_decrypt` 函数进行解密操作,并去除填充部分得到原始字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值