IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP实现RSA算法 -> 正文阅读

[PHP知识库]PHP实现RSA算法

sample-php-rsa

PHP RSA加解密原理实现(不调用php内置的rsa函数,纯方法实现)

原理参考: RSA算法原理
https://zhuanlan.zhihu.com/p/48249182

示例:

$rsa = new sample_rsa();
$key = $rsa->createKey();

$encrypt_data = $rsa->encrypt_data($key, 'test');

echo $encrypt_data.PHP_EOL;

$decrypt_data = $rsa->decrypt_data($key, $encrypt_data);

echo $decrypt_data.PHP_EOL;

class sample_rsa
{			
	public  function encrypt($key, $m = 30)
	{
		$e = $key['publicKey'][1];
		$n = $key['publicKey'][0];
		$c = $this->Mode($m, $e, $n);;

		return $c;
	}

	public function decrypt($key, $c)
	{
		$d =  $key['privateKey'][1];
		$n = $key['publicKey'][0];
		$res = $this->Mode($c, $d, $n);
		
		return $res;
	}
	 
	public function createKey()
	{
		$a = array();
		for($i = 1000; $i < 3000; $i++) {
			$primes = 0;
			for($k = 1; $k <= $i; $k++)
			if($i%$k === 0) $primes++;
			if($primes <= 2) // 能除以1和自身的整数(不包括0)
			$a[] = $i;
		}
		
		$p = $a[mt_rand(0,count($a)-1)];
		$q = $a[mt_rand(0,count($a)-1)];

		$n = $p * $q;

		$res = $this->Euler($n);
		
		$re = array();
		foreach($a as $v){
			if($v<$res && $v > 1) {
				$re[] = $v;
			}
		}

		$e = $re[mt_rand(0,count($re)-1)]; // 1< e < 欧拉函数(n)
		
		$d = $this->cal($e,$res,1);

		$public = array($n, $e);
		$private = array($n, $d);

		return array('publicKey'=>$public, 'privateKey'=>$private);
	}

	public function Euler($x)
	{
		$res = $x;
		$now = 2;
		while ($x > 1) {
			if ($x % $now == 0) {
				$res /= $now;
				$res *= ($now - 1);
				while ($x % $now == 0) {
					$x /= $now;
				}
			}
			$now++;
		}
		return $res;
	}

	public function e_gcd($a, $b, &$x, &$y)
	{
		if($b==0)
		{
			$x=1;
			$y=0;
			return $a;
		}
		$ans=$this->e_gcd($b,$a%$b,$x,$y);
		$temp=$x;
		$x=$y;
		$y=$temp-floor($a/$b)*$y;
		return $ans;
	}

	public function cal($a, $b, $c)
	{
		$x = 0;
		$y = 0;
		$gcd = $this->e_gcd($a,$b,$x,$y);
		if($c%$gcd!=0) return -1;
		$x*=$c/$gcd;
		$b/=$gcd;
		if($b<0) $b=-$b;
		$ans=$x%$b;
		if($ans<=0) $ans+=$b;
		return $ans;
	}

	public function Mode($a, $b, $mode)
	{
		$sum = 1;
		while ($b) 
		{
			if ($b & 1) 
			{
				$sum = ($sum * $a) % $mode;
				$b--;
			}
			$b /= 2;
			$a = $a * $a % $mode;
		}
		return $sum;
	}
	
	public function encrypt_data($key, $data)
	{
			
		$test = bin2hex($data);

		$enc = array();
		for($i=0;$i<strlen($test);$i++) {
			$t = ord( substr($test, $i, 1) );
			 $str = $this->encrypt($key, $t);
			 
			 $z = 10-strlen($str);
			 for($t=0;$t<$z;$t++) {
				$str= '0'.$str;
			 }
			 $enc[] = $str;
			 
			
		}
		return join('', $enc);
	}

	public function decrypt_data($key, $encrypt)
	{
		$encrypt_arr = array();
		$i=0;
		do{
			if($arr = substr($encrypt,$i, 10)) {
				
				$encrypt_arr[] = (int)$arr;
			}
			$i+=10;
		}
		while($arr);
		
		$jay = array();
		foreach($encrypt_arr as $v) {
			$jay[] = chr($this->decrypt($key, $v));
		}
		$jayc = join('', $jay);


		return (hex2bin($jayc)."\n");

	}
	
};
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 10:58:33  更:2021-07-16 10:59:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 23:20:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码