2014-03-13 2 views
0

클라이언트에서 JCSL - Javascript를 사용 중입니다. (documentation) 및 OpenSSL -12x에서 Ruby를 사용하여 Elliptic Curve Diffie-Hellman을 사용하여 클라이언트와 서버 모두에서 대칭 키를 생성합니다.타원 곡선 Diffie-Hellman 대칭 키가 클라이언트와 서버에서 일치하지 않음

어떻게 든 마지막으로 클라이언트와 서버에서 전송되는 제대로 공개 키의 형식을 관리했습니다, 더 이상 오류 그러나

(my previous question) 런타임없이 나는 마침내 대칭 키를 생성 한

, 문제는 지금이다 Client's Symmetric Key != Server's Symmetric Key

나는 당신이 당신의 컴퓨터에 이것을 시도 할 수 있다면 가장 좋은 것입니다 느낌, 그래서 나는 시험 편의 (link)

내 코드에 대한 JCSL (이것은 타원 곡선 포함)에서 컴파일 된 JS 파일을 업로드 생각 다음과 같이 (당신 단지) 시험 편의를 위해이를 복사하여 붙여 넣을 수 있습니다 : 클라이언트 측에

#Ruby on Rails 
class EcdhController < ApplicationController 

    @@group = OpenSSL::PKey::EC::Group.new('secp384r1') 
    @@ec = OpenSSL::PKey::EC.new(@@group) 

    def connect 
    logger.info('CONNECT PAGE:::::::::::::::::') 
    end 

    def send_params 
    logger.info('SEND_PARAMS::::::::::::::::::') 

    #GENERATE PUBLIC AND PRIVATE KEYS 
    @@ec.generate_key 

    #SEND PUBLIC KEY TO CLIENT/BROWSER 
    #[2..-1] means I've removed the first two Hex characters which is x04 which I think is automatically prepended by OpenSSL which causes errors in the Client JS side 
    render :json => {:server_pub_key => @@ec.public_key.to_bn.to_s(16)[2..-1]} 
    end 

    def receive_client_pub_key 
    logger.info('RECEIVE_CLIENT_PUB_KEY:::::::::::::::') 

    #Convert properly the format of the JCSL pub key on client side 
    client_pub_key = (params[:client_pub_key].split(",").map { |s| s.to_i }).pack('N*') 

    #Copied from https://stackoverflow.com/questions/11135420/elliptic-curve-cryptography-with-sjcl-in-js-and-openssl-in-ruby 
    algokey = OpenSSL::ASN1::ObjectId 'id-ecPublicKey' 
    algovalue = OpenSSL::ASN1::ObjectId 'secp384r1' 
    algo = OpenSSL::ASN1::Sequence.new [algokey,algovalue] 
    # for some reason OpenSSL seems to prepend 0x04 to all public keys 
    key = OpenSSL::ASN1::BitString.new "\x04#{client_pub_key}" 
    root = OpenSSL::ASN1::Sequence.new [algo,key] 

    pub = OpenSSL::PKey.read(root.to_der) 
    #-End of copied code-# 

    #COMPUTE SYMMETRIC KEY 
    symm_key = @@ec.dh_compute_key(pub.public_key) 

    puts "SYMM KEY: #{symm_key.unpack('H*').first}" 

    #---> SYMM KEY: f8de0a7012765a1ff8b7630c917a1d3d2ac9cc0d782fbb6c0c101128a29232fec5194468b7ed846053abab05744c61e9  

    render :json => nil 
    end 
end 

동안은,

//Javascript 
<h1>Ecdh#connect</h1> 
<p>Find me in app/views/ecdh/connect.html.erb</p> 

<script> 
    $(document).ready(function() 
    { 
     var server_pub_key; 
     var client_priv_key; 
     var client_pub_key; 

     connect(); 

     function connect() 
     { 
      //Receive Server Public Key 
      jQuery.getJSON('<%= url_for(:controller => :ecdh, :action => :send_params) %>', function(data) 
      { 
       //Get Server Public Key 
       server_pub_key_Bits = new sjcl.bn(data.server_pub_key.toString()).toBits(); //Convert Hex String to BN, and then to Bits 

       //Client Keys 
       client_keys = sjcl.ecc.elGamal.generateKeys(384, 0); 
       client_keys.generate_keys; 

       client_pub_key_Hex = sjcl.bn.fromBits(client_keys.pub.serialize().point).toString(16); //Into bits, then to Hex 
       client_priv_key = client_keys.sec; //sjcl.ecc.elGamal.privateKey format 

       //Send Client/Own Public Key to Server 
       jQuery.getJSON('<%= url_for(:controller => :ecdh, :action => :receive_client_pub_key) %>?client_pub_key='+client_keys.pub.serialize().point, function() 
       { 
        //Set Curve from Template 
        curve = sjcl.ecc.curves['c384']; 

        //Convert server_pub_key_Bits to proper 'publicKey' format 
        server_pub_key = new sjcl.ecc.elGamal.publicKey(384, curve, server_pub_key_Bits); 

        //Compute Shared Key 
        symm_key_Bits = client_priv_key.dh(server_pub_key); 
        symm_key_Hex = sjcl.bn.fromBits(symm_key_Bits).toString(16); 

        console.log(symm_key_Hex); 

        //---> 0xa779359617b008884b67c0785a3f782b9dca6e46f9586f7e911b73de877f2aca 
       }); 
      }); 
     } 
    }); 
</script> 

이 때문에 내 문제가

f8de0a7012765a1ff8b7630c917a1d3d2ac9cc0d782fbb6c0c101128a29232fec5194468b7ed846053abab05744c61e9 
!= 
0xa779359617b008884b67c0785a3f782b9dca6e46f9586f7e911b73de877f2aca 

어떻게 변환하는 형식으로 물어 자유롭게이다 그리고 이것이 내 프로젝트에서 중요하기 때문에 테스트를 원한다면 뭐든지 할 수 있습니다. 도와주세요. 감사합니다

답변

0

는 드디어이 문제 :

지금은 자바 스크립트 클라이언트에 JSBN-EC (link)보다는 JCSL을 사용하고 해결했습니다.

자세한 내용은 (this) 다른 내 질문을 참조하십시오.

관련 문제