찾다
백엔드 개발PHP 튜토리얼自定义加密算法的实现

自定义加密算法的实现

Jun 23, 2016 pm 01:57 PM
암호화 알고리즘사용자 정의

由于要传一个需要保密的ID,因此用到对称加密,但mcrypt_encrypt算法加密后字符串太长,因此想实现一个自定义加密算法,想法如下

首先先对key计算sha1,取结果的前32bit,然后跟要加密整数进行异或,得到一个加密后的32bit结果

对结果分组:2bit | 6bit | 6bit | 6bit | 6bit | 6bit

各个组分别取名为:a0、a1、a2、a3、a4、a5

另定义一个长度64的字典数组

$dict=array('1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'01','02','03');

将前面每个分组的值作为字典数组的下标,则加密结果为:$dict[a0].$dict[a1].$dict[a2].$dict[a3].$dict[a4].$dict[a5]

这样加密后的结果就是一个长度6-12的字符串,如果字典数组最后3个元素用其他单字符表示,那么结果就固定为6个字符的字符串。

由于初学php不久,对php的函数库不熟悉,求大侠帮忙实现下加密解密算法:

string encrypt(int id,string key)

int decrypt(string text,string key)





回复讨论(解决方案)

echo encrypt(1234, 'abc'), PHP_EOL;echo decrypt( '1TgGSY', 'abc');function encrypt($id, $key) {  $dict = array('1','2','3','4','5','6','7','8','9',    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',    '-','=','*'  );  $key = current(unpack('L', sha1($key, 1)));  $id ^= $key;  $t = str_split(sprintf('%036b', $id), 6);  foreach($t as &$v) $v = $dict[bindec($v)];  return join($t);}function decrypt($s, $key) {  $dict = array('1','2','3','4','5','6','7','8','9',    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',    '-','=','*'  );  $dict = array_flip($dict);  foreach(str_split($s) as $c) $r[] = sprintf('%06b', $dict[$c]);  $id = bindec(join($r));  $key = current(unpack('L', sha1($key, 1)));  return $id ^ $key;}
1TgGSY
1234



我自己也实现了加密过程,不过看起来就没那么优雅了,执行效率也低点,贴出来衬托下高手风范 

$key_string = 'abc';function keyToInt($key) {	$key_sha1 = sha1 ( $key );	$first_char = $key_sha1 [0];	if (ord ( $first_char ) > 55) {		return hexdec ( (hexdec ( $first_char ) & 7) . substr ( $key_sha1, 1, 7 ) ) | (- 2147483648);	} else {		return hexdec ( $key_sha1 );	}}function Encrypt($num){		$dict = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','*','!');	$r1 = $num ^ keyToInt ( $key_string );	$r2 = decbin ( $r1 );	$r3 = array (			bindec ( substr ( $r2, 0, 2 ) ),			bindec ( substr ( $r2, 2, 6 ) ),			bindec ( substr ( $r2, 8, 6 ) ),			bindec ( substr ( $r2, 14, 6 ) ),			bindec ( substr ( $r2, 20, 6 ) ),			bindec ( substr ( $r2, 26, 6 ) ) 	);	return $dict [$r3 [0]] . $dict [$r3 [1]] . $dict [$r3 [2]] . $dict [$r3 [3]] . $dict [$r3 [4]] . $dict [$r3 [5]];}


算法实现之后,发觉在设计算法时,有个缺陷没考虑到,

由于仅仅是id与key异或,加密后的结果存在一定规律性,

比如
1234->1TgGSY 
1235->1TgGSX

有没有什么好的办法打散下结果?

这个够乱的了吧

$id = 1234;$key = 'aaa';for($i=1; $i<100; $i++) {  printf("%-10d %s %s\n", $id, $s = encrypt($id++, $key), decrypt( $s, $key));}function encrypt($id, $key) {  $dict = array('1','2','3','4','5','6','7','8','9',    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',    '-','=','*'  );  $n = rand(0, 15);  srand($n);  $key = current(unpack('L', substr(sha1($key, 1), $n)));  $id ^= $key;  $t = str_split(sprintf('%04b%032b', $n, $id), 6);  foreach($t as $i=>&$v) {    $v = $dict[bindec($v)];    if($i == 0) shuffle($dict);  }  return join($t);}function decrypt($s, $key) {  $dict = array('1','2','3','4','5','6','7','8','9',    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',    '-','=','*'  );  $m = array_search($s{0}, $dict);  $n = $m >> 2;  srand($n);  shuffle($dict);  $dict = array_flip($dict);  foreach(str_split($s) as $i=>$c) {    $r[] = sprintf('%06b', $i==0 ? $m&0x03 : $dict[$c]);  }      $id = bindec(join($r));  $key = current(unpack('L', substr(sha1($key, 1), $n)));  return $id ^ $key;}
1234       4rHK4B 12341235       oD2LN* 12351236       wqkf8u 12361237       6k=GVU 12371238       bxeCr* 12381239       =W-AOi 12391240       IiQ3e1 12401241       z6uMMA 12411242       WLcnd8 12421243       Rizj*M 12431244       4rHK47 12441245       oD2LNT 12451246       wqkf8Z 12461247       6k=GVJ 12471248       bxeCrE 12481249       =W-AOP 12491250       IiQ3et 12501251       z6uMMP 12511252       WLcndU 12521253       Rizj*p 12531254       4rHK4s 12541255       oD2LNs 12551256       wqkf84 12561257       6k=GVn 12571258       bxeCrL 12581259       =W-AOT 12591260       IiQ3ex 12601261       z6uMM1 12611262       WLcndD 12621263       Rizj*s 12631264       4rHK4h 12641265       oD2LNq 12651266       wqkf83 12661267       6k=GVg 12671268       bxeCr5 12681269       =W-AOH 12691270       IiQ3eP 12701271       z6uMMc 12711272       WLcndE 12721273       Rizj*6 12731274       4rHK4I 12741275       oD2LN= 12751276       wqkf8U 12761277       6k=GVI 12771278       bxeCr9 12781279       =W-AOl 12791280       IiQ3bI 12801281       z6uMhG 12811282       WLcnaY 12821283       Rizj6d 12831284       4rHK3Z 12841285       oD2L*n 12851286       wqkfbP 12861287       6k=Gzj 12871288       bxeC=o 12881289       =W-AEd 12891290       IiQ3bY 12901291       z6uMh* 12911292       WLcnag 12921293       Rizj6v 12931294       4rHK3F 12941295       oD2L*e 12951296       wqkfbJ 12961297       6k=Gzm 12971298       bxeC=N 12981299       =W-AEw 12991300       IiQ3bs 13001301       z6uMhl 13011302       WLcna4 13021303       Rizj6V 13031304       4rHK3u 13041305       oD2L*V 13051306       wqkfbm 13061307       6k=Gz* 13071308       bxeC=- 13081309       =W-AEa 13091310       IiQ3bm 13101311       z6uMhe 13111312       WLcnaS 13121313       Rizj6= 13131314       4rHK38 13141315       oD2L*l 13151316       wqkfbS 13161317       6k=Gz6 13171318       bxeC=q 13181319       =W-AEn 13191320       IiQ3bO 13201321       z6uMhV 13211322       WLcnau 13221323       Rizj61 13231324       4rHK3K 13241325       oD2L*p 13251326       wqkfbv 13261327       6k=Gzw 13271328       bxeC=h 13281329       =W-AE- 13291330       IiQ3bS 13301331       z6uMhj 13311332       WLcna9 1332

在你的设计中,第一节只有 2bit 有效位,所以可在其上再附加4bit信息
而0~15的随机数正好是4bit

算法中,这个随机数起到2个作用
1、调整 key
2、打乱字典

如果不怎么需要太强的保密性,位运算移位就足够了,省点CPU

楼主的解答超赞
加上随机数后,1个整数可对应16种结果,64^6种结果尽数用上,解密时也不用再判断是不是无效字符串了。

是楼主的解答超赞,打错啦

不打了

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

PHP 대 기타 언어 : 비교PHP 대 기타 언어 : 비교Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP vs. Python : 핵심 기능 및 기능PHP vs. Python : 핵심 기능 및 기능Apr 13, 2025 am 12:16 AM

PHP와 Python은 각각 고유 한 장점이 있으며 다양한 시나리오에 적합합니다. 1.PHP는 웹 개발에 적합하며 내장 웹 서버 및 풍부한 기능 라이브러리를 제공합니다. 2. Python은 간결한 구문과 강력한 표준 라이브러리가있는 데이터 과학 및 기계 학습에 적합합니다. 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

PHP : 웹 개발의 핵심 언어PHP : 웹 개발의 핵심 언어Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP : 많은 웹 사이트의 기초PHP : 많은 웹 사이트의 기초Apr 13, 2025 am 12:07 AM

PHP가 많은 웹 사이트에서 선호되는 기술 스택 인 이유에는 사용 편의성, 강력한 커뮤니티 지원 및 광범위한 사용이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 거대한 개발자 커뮤니티와 풍부한 자원이 있습니다. 3) WordPress, Drupal 및 기타 플랫폼에서 널리 사용됩니다. 4) 웹 서버와 밀접하게 통합하여 개발 배포를 단순화합니다.

과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.