php openssl非对称加密解密实例,使用openssl实现rsa非对称加密算法示例_PHP教程

这篇文章主要介绍了使用openssl实现rsa非对称加密算法的示例,大家参考使用吧

代码如下:

_keyPath = $path;

}

/**

* create the key pair,save the key to $this->_keyPath

*/

public function createKey()

{

$r = openssl_pkey_new();

openssl_pkey_export($r, $privKey);

file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);

$this->_privKey = openssl_pkey_get_public($privKey);

$rp = openssl_pkey_get_details($r);

$pubKey = $rp['key'];

file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);

$this->_pubKey = openssl_pkey_get_public($pubKey);

}

/**

* setup the private key

*/

public function setupPrivKey()

{

if(is_resource($this->_privKey)){

return true;

}

$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';

$prk = file_get_contents($file);

$this->_privKey = openssl_pkey_get_private($prk);

return true;

}

/**

* setup the public key

*/

public function setupPubKey()

{

if(is_resource($this->_pubKey)){

return true;

}

$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';

$puk = file_get_contents($file);

$this->_pubKey = openssl_pkey_get_public($puk);

return true;

}

/**

* encrypt with the private key

*/

public function privEncrypt($data)

{

if(!is_string($data)){

return null;

}

$this->setupPrivKey();

$r = openssl_private_encrypt($data, $encrypted, $this->_privKey);

if($r){

return base64_encode($encrypted);

}

return null;

}

/**

* decrypt with the private key

*/

public function privDecrypt($encrypted)

{

if(!is_string($encrypted)){

return null;

}

$this->setupPrivKey();

$encrypted = base64_decode($encrypted);

$r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);

if($r){

return $decrypted;

}

return null;

}

/**

* encrypt with public key

*/

public function pubEncrypt($data)

{

if(!is_string($data)){

return null;

}

$this->setupPubKey();

$r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);

if($r){

return base64_encode($encrypted);

}

return null;

}

/**

* decrypt with the public key

*/

public function pubDecrypt($crypted)

{

if(!is_string($crypted)){

return null;

}

$this->setupPubKey();

$crypted = base64_decode($crypted);

$r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);

if($r){

return $decrypted;

}

return null;

}

public function __destruct()

{

@ fclose($this->_privKey);

@ fclose($this->_pubKey);

}

}

//以下是一个简单的测试demo,如果不需要请删除

$rsa = new Rsa('ssl-key');

//私钥加密,公钥解密

echo 'source:我是老鳖

';

$pre = $rsa->privEncrypt('我是老鳖');

echo 'private encrypted:

' . $pre . '

';

$pud = $rsa->pubDecrypt($pre);

echo 'public decrypted:' . $pud . '

';

//公钥加密,私钥解密

echo 'source:干IT的

';

$pue = $rsa->pubEncrypt('干IT的');

echo 'public encrypt:

' . $pue . '

';

$prd = $rsa->privDecrypt($pue);

echo 'private decrypt:' . $prd;

?>

需要注意的是apache要支持OpenSSL

http://www.bkjia.com/PHPjc/727549.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/727549.htmlTechArticle这篇文章主要介绍了使用openssl实现rsa非对称加密算法的示例,大家参考使用吧 代码如下:?php/*** 使用openssl实现非对称加密* @since 2010-07-08*...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 OpenSSL 库对大文件进行 ECC 算法的非对称加密解密示例代码: ```c++ #include <openssl/evp.h> #include <openssl/ec.h> #include <openssl/ecdsa.h> #include <openssl/rand.h> #include <openssl/pem.h> #include <iostream> #include <fstream> using namespace std; // 加密函数 int ecc_encrypt(unsigned char* plaintext, int plaintext_len, unsigned char* ciphertext, int* ciphertext_len, EC_KEY* ec_key) { EVP_PKEY* pkey = EVP_PKEY_new(); EVP_PKEY_set1_EC_KEY(pkey, ec_key); EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr); if (ctx == nullptr) { cerr << "Error: EVP_PKEY_CTX_new() failed" << endl; return -1; } if (EVP_PKEY_encrypt_init(ctx) <= 0) { cerr << "Error: EVP_PKEY_encrypt_init() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0) { cerr << "Error: EVP_PKEY_CTX_set_rsa_padding() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, EVP_sha256()) <= 0) { cerr << "Error: EVP_PKEY_CTX_set_rsa_oaep_md() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_encrypt(ctx, ciphertext, ciphertext_len, plaintext, plaintext_len) <= 0) { cerr << "Error: EVP_PKEY_encrypt() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); return 0; } // 解密函数 int ecc_decrypt(unsigned char* ciphertext, int ciphertext_len, unsigned char* plaintext, int* plaintext_len, EC_KEY* ec_key) { EVP_PKEY* pkey = EVP_PKEY_new(); EVP_PKEY_set1_EC_KEY(pkey, ec_key); EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new(pkey, nullptr); if (ctx == nullptr) { cerr << "Error: EVP_PKEY_CTX_new() failed" << endl; return -1; } if (EVP_PKEY_decrypt_init(ctx) <= 0) { cerr << "Error: EVP_PKEY_decrypt_init() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0) { cerr << "Error: EVP_PKEY_CTX_set_rsa_padding() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, EVP_sha256()) <= 0) { cerr << "Error: EVP_PKEY_CTX_set_rsa_oaep_md() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } if (EVP_PKEY_decrypt(ctx, plaintext, plaintext_len, ciphertext, ciphertext_len) <= 0) { cerr << "Error: EVP_PKEY_decrypt() failed" << endl; EVP_PKEY_CTX_free(ctx); return -1; } EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); return 0; } int main(int argc, char* argv[]) { // 生成 ECC 密钥对 EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_secp384r1); if (ec_key == nullptr) { cerr << "Error: EC_KEY_new_by_curve_name() failed" << endl; return -1; } if (EC_KEY_generate_key(ec_key) <= 0) { cerr << "Error: EC_KEY_generate_key() failed" << endl; EC_KEY_free(ec_key); return -1; } // 打开需要加密的文件 ifstream fin("plaintext.txt", ios::binary); if (!fin) { cerr << "Error: cannot open file" << endl; EC_KEY_free(ec_key); return -1; } // 计算需要加密的文件的长度 fin.seekg(0, ios::end); int plaintext_len = fin.tellg(); fin.seekg(0, ios::beg); // 读入需要加密的文件 unsigned char* plaintext = new unsigned char[plaintext_len]; fin.read((char*)plaintext, plaintext_len); fin.close(); // 计算加密后的文件的长度 int ciphertext_len = EC_GROUP_get_degree(EC_KEY_get0_group(ec_key)) / 8 + 1 + plaintext_len + EVP_MD_size(EVP_sha256()); unsigned char* ciphertext = new unsigned char[ciphertext_len]; // 加密 int ret = ecc_encrypt(plaintext, plaintext_len, ciphertext, &ciphertext_len, ec_key); if (ret != 0) { EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return -1; } // 将加密后的文件写入磁盘 ofstream fout("ciphertext.bin", ios::binary); if (!fout) { cerr << "Error: cannot open file" << endl; EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return -1; } fout.write((char*)ciphertext, ciphertext_len); fout.close(); // 打开需要解密的文件 fin.open("ciphertext.bin", ios::binary); if (!fin) { cerr << "Error: cannot open file" << endl; EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return -1; } // 计算需要解密的文件的长度 fin.seekg(0, ios::end); ciphertext_len = fin.tellg(); fin.seekg(0, ios::beg); // 读入需要解密的文件 ciphertext = new unsigned char[ciphertext_len]; fin.read((char*)ciphertext, ciphertext_len); fin.close(); // 计算解密后的文件的长度 plaintext_len = ciphertext_len - EC_GROUP_get_degree(EC_KEY_get0_group(ec_key)) / 8 - 1 - EVP_MD_size(EVP_sha256()); plaintext = new unsigned char[plaintext_len]; // 解密 ret = ecc_decrypt(ciphertext, ciphertext_len, plaintext, &plaintext_len, ec_key); if (ret != 0) { EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return -1; } // 将解密后的文件写入磁盘 fout.open("decrypted.txt", ios::binary); if (!fout) { cerr << "Error: cannot open file" << endl; EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return -1; } fout.write((char*)plaintext, plaintext_len); fout.close(); EC_KEY_free(ec_key); delete[] plaintext; delete[] ciphertext; return 0; } ``` 这个示例代码使用OpenSSL 库提供的 EVP 接口进行 ECC 算法的加密和解密。其中,`ecc_encrypt` 函数使用 ECC 密钥对对明文进行加密,`ecc_decrypt` 函数使用 ECC 密钥对对密文进行解密。在主函数中,首先生成一个 ECC 密钥对,然后读入需要加密的文件,计算加密后的文件的长度,进行加密,并将加密后的文件写入磁盘。接着,读入需要解密的文件,计算解密后的文件的长度,进行解密,并将解密后的文件写入磁盘。注意,在实际应用中,需要保证密文的安全性,可以使用对称加密算法对密文进行进一步的保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值