ホームページ  >  記事  >  バックエンド開発  >  カスタム暗号化アルゴリズムの実装

カスタム暗号化アルゴリズムの実装

WBOY
WBOYオリジナル
2016-06-23 13:57:481271ブラウズ

ID を秘密にしておく必要があるため、対称暗号化が使用されますが、mcrypt_encrypt アルゴリズムで暗号化された文字列が長すぎるため、カスタム暗号化アルゴリズムを実装したいと考えています。 アイデアは次のとおりです

まず、 の sha1 を計算します。キーを取得し、結果のプレフィックスを取得し、暗号化された整数と XOR を実行して、暗号化された 32 ビットの結果を取得します。
各グループの名前は次のとおりです。 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]];}


アルゴリズムを実装した後、アルゴリズムを設計するときに考慮されていなかった欠陥があることがわかりました

単なる XOR であるため。 ID とキーの暗号化結果には一定の規則性があります。

たとえば、
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


あなたのデザインでは、最初のセクションには有効なビットが 2 つしかないので、それに 4 ビットの情報を追加できます

そして、0 から 15 までの乱数は正確に 4 ビットです

アルゴリズムでは、このランダムは数値は2つの役割を果たします

1. キーを調整します
2. 辞書を混乱させます

必要ない場合は、機密性が強すぎるため、ビット演算とシフトで十分であり、CPU を節約します

著者の答えは素晴らしいです

乱数を追加した後、1整数は 16 個の結果に対応でき、64^6 個の結果はすべて復号に使用できます。無効な文字列かどうかを判断する必要はありません。

著者の答えは素晴らしいですが、それはタイプミスです


もうだめです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。