ajax 요청 을 위주 로 하 는 응용, 데이터 전송 암호 화 솔 루 션

4275 단어 phpjs
우선 키 교환 과정 입 니 다. Diffie - Hellman 키 교환 알고리즘 은 위 키 백과 문 서 를 참고 합 니 다.
http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
client 단 js 언어, 서버 phop 언어 는 DH 키 교환 알고리즘 으로 키 를 교환 합 니 다.
var g = "2";  
  var p = "106025087133488299239129351247929016326438167258746469805890028339770628303789813787064911279666129";  
  function doStaff() {
    var big_a = randBigInt(100);
    var big_p = str2bigInt(p, 10, 0);
    var big_g = str2bigInt(g, 10, 0);
    
    var A = powMod(big_g, big_a, big_p);
    var str_A = bigInt2str(A, 10);
    
    var B;
    var secret;
    
    $.ajax({
        url:  'server.php',
        type: 'GET',
        async: false,
        data: {"A":str_A},
        cache: false,
        timeout: 5 * 1000,
        dataType: 'json',
        success: function(data, status, xhr) {
            B = str2bigInt(data.B, 10, 0);
        },
        error: function() {
            alert(2);
        }
    });
    
    secret = powMod(B, big_a, big_p);
    secret = bigInt2str(secret, 10);

위의 코드 에서 마지막 으로 도착 한 시 크 릿 은 최종 적 으로 서버 와 일치 하 는 키 입 니 다.  위 코드 에서 big int 와 관련 된 js 는 오픈 소스 의 bigint. js (js 코드 는 오픈 소스 가 없 습 니까? ^ ^) 를 직접 사용 합 니 다. 여기 참조:http://leemon.com/crypto/BigInt.js
서버 php 코드:

이 를 통 해 알 수 있 듯 이 우 리 는 고정된 g 와 p 를 사용 하 는데 이 두 변 수 는 공개 적 이 고 누설 을 두려워 하지 않 는 다.  js 단 은 먼저 100 bit 길이 의 정수 a 를 생 성하 고 공식 에 따라 A 를 계산 하여 ajax 형식 으로 서버 phop 에 보 냅 니 다. 서버 는 A 를 받 고 변 수 를 생 성 합 니 다. b 는 공식 에 따라 B 를 계산 하여 클 라 이언 트 js 에 응답 합 니 다.  이때 서버 와 클 라 이언 트 는 각각 공식 에 따라 같은 시 크 릿 을 계산 할 수 있 습 니 다. 이 시 크 릿 은 네트워크 에서 전송 되 지 않 았 습 니 다. 쌍방 은 '이심전심' 이 라 고 할 수 있 고 쌍방 이 스스로 선택 한 a 와 b 는 비밀 입 니 다. 제3자 가 공개 적 으로 전송 한 데이터 에 따라 a, b 를 계산 할 수 없습니다. 물론 시 크 릿 을 얻 을 수 없습니다. 이것 이 바로 DH 알고리즘 의 원리 입 니 다.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 화려 한 분할 선 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =  키 교환 이 끝 난 후, 우 리 는 쌍방 이 대칭 적 으로 암호 화 된 키 를 가지 고 있다 고 가정 합 니 다. 다음은 AES 알고리즘 demo 입 니 다. 각각 js 암호 화 pp 복호화 와 반대로 phop 암호 화 js 복호화 가 있 습 니 다.
crypt - js 라 는 js 라 이브 러 리 를 사 용 했 습 니 다. 공식 주 소 는?http://code.google.com/p/crypto-js/#CryptoJS_3.1  js 암호 화:
var pwd = "123456";
var key = CryptoJS.enc.Utf8.parse("96e79218965eb72c92a549dd5a330112"); //CryptoJS.MD5("111111");
var iv  = CryptoJS.enc.Utf8.parse('1234567812345678');

var encrypted = CryptoJS.AES.encrypt(pwd, key, {iv:iv});
document.write(encrypted.toString());

여기에 적 힌 값 은 암호 화 된 비밀문서 입 니 다. toString 방법 으로 얻 을 수 있 습 니 다. crypto - js 문서 에 따 르 면 openssl 형식 을 호 환 하 는 보 이 는 텍스트 형식 입 니 다. 
이 값 은 php 에서 복호화 합 니 다:
$iv='1234567812345678';
$key = "96e79218965eb72c92a549dd5a330112";
$data = "FBPJjTRA4MEkMcMDg7eOng==";
$data = base64_decode($data);
$ttt = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
echo "decrypted : $ttt";

다음 코드 demo 는 php 단 암호 화, js 복호화 입 니 다. 
php 암호 화:
$svrMessage = "server message . .. adfasdfsdaf   adfasdfsdaf";

$iv='1234567812345678';
$key = "96e79218965eb72c92a549dd5a330112";

$enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $svrMessage, MCRYPT_MODE_CBC, $iv);
$enc = base64_encode($enc);
echo "
$enc";

출력 결 과 는 base 64 를 거 쳐 보 이 는 문자 로 바 뀌 었 습 니 다.
js 복호화:
var received = "UQhDUzgusxZiejMuuVjh78BcpoQt82swQvSqyCvnuTdb3drBJTPghFBmTORflU6h"; 
var eee = CryptoJS.enc.Base64.parse(received);

var ddd = CryptoJS.AES.decrypt({
    ciphertext: CryptoJS.enc.Base64.parse(received),
    salt: ""
  }, key, {iv:iv});
document.write(ddd.toString(CryptoJS.enc.Utf8) + "
");

좋은 웹페이지 즐겨찾기