2013-07-12 154 views
0

因此,我編寫了一個使用JSON在客戶端和服務器之間發送消息的安全消息傳遞腳本。有一次,我使用SHA1生成簽名的消息摘要,這給了我一些我無法在JSON中解析的字符。生成以JSON格式發送我的消息。任何人都可以幫我解決這個錯誤「編碼」:「\ xAB」從ASCII-8BIT到UTF-8(Encoding :: UndefinedConversionError)「?JSON編碼問題Ruby 2.0.0

我遇到的主要問題是這部分代碼:

#make new private/public rsa key-pair 
rsakey = OpenSSL::PKey::RSA.new 2048 

#hash the key using sha1 
sha1 = OpenSSL::Digest::SHA1.new 
digest = sha1.digest(rsakey.public_key.to_pem) 

pubkey = JSON.generate({ 
    key: rsakey.public_key.to_pem, 
    digest: digest 
    }) 

這不是讓我做摘要的JSON.generate。有誰知道解決方法或其他方式來編碼我的消息摘要?

我的全代碼如下:

# encoding: utf-8 
require 'socket' 
require 'openssl' 
require 'json' 

port = 9090 

s = TCPServer.open(port) 

#make new private/public rsa key-pair 
rsakey = OpenSSL::PKey::RSA.new 2048 

#hash the key using sha1 
sha1 = OpenSSL::Digest::SHA1.new 
digest = sha1.digest(rsakey.public_key.to_pem) 

pubkey = JSON.generate({ 
    key: rsakey.public_key.to_pem, 
    digest: digest 
    }) 

loop { 
    client = s.accept 
    #get public key from alice 
    incoming = client.gets() 
    alice = JSON.parse(incoming) 
    alice_key = OpenSSL::PKey::RSA.new alice['key'] 

    #send public key to alice 
    puts pubkey 
    client.puts pubkey 

    #get encrypted package from alice 
    json_full_package = client.gets() 
    full_package = JSON.parse(json_full_package) 

    #decrypt and print package 
    cipher = OpenSSL::Cipher.new("DES3") 
    cipher.decrypt 
    key = rsakey.private_decrypt(full_package['key']) 
    iv = rsakey.private_decrypt(full_package['iv']) 
    json_package = cipher.update(full_package['package']) 

    package = JSON.parse(json_package) 
    decrypted_digest = alice_key.public_decrypt(package['signed_digest']) 
    sha1 = OpenSSL::Digest::SHA1.new 
    digest = sha1.digest(package['data']) 
    throw 'failed digest' unless digest == decrypted_digest 

    puts package['data'] 
    client.close 
} 

# encoding: utf-8 
require 'socket' 
require 'openssl' 
require 'json' 

host = 'lab1-15.eng.utah.edu' 
port = 9090 

s = TCPSocket.open(host, port) 

pubkey_q = false 

keyF = File.new("public_key.pem", 'w') 

#generate alice's key pair 
key = OpenSSL::PKey::RSA.new 2048 

to_bob_public = JSON.generate({ 
    key: key.public_key.to_pem 
    }) 
s.send(to_bob_public) 

#get public key certificate from bob 
while line = s.gets 
    puts line.chop 
    bob = JSON.parse(line) 
end 
bob_key = OpenSSL::PKey::RSA.new bob['key'] 
bob_digest = bob['digest'] 

#verify public key 
sha1 = OpenSSL::Digest::SHA1.new 
t_digest = sha1.digest(bob['key']) 
throw "not verified" unless t_digest == bob_digest 

data = File.read('document') #data is original message 

#hash the document using sha1 
sha1 = OpenSSL::Digest::SHA1.new 
digest = sha1.digest(data) 

#sign with private key 
signed_digest = key.private_encrypt(digest) 

#package this in json 
package = JSON.generate({ 
     signed_digest: signed_digest, 
     data: data  
    }) 

#make cipher for encryption 
cipher = OpenSSL::Cipher.new("DES3") 
cipher.encrypt 
key = cipher.random_key 
iv = cipher.random_iv 
#encrypt data 
encrypted = cipher.update(package) 

#encrypt key and iv using bob's public key 
encrypted_cipher_key = bob_key.public_encrypt(key) 
encrypted_cipher_iv = bob_key.public_encrypt(iv) 

full_package = JSON.generate({ 
     key: encrypted_cipher_key, 
     iv: encrypted_cipher_iv, 
     package: encrypted  
    }) 

#send full_package to bob 
s.send(full_package) 

s.close 

回答

1

使用#hexdigest代替#digest,你會得到十六進制。現在你試圖將二進制編碼到JSON中(因爲這是#digest返回),並且導致編碼失敗。

+0

這個工作,但現在我得到的線signed_digest = key.private_encrypt同樣的問題(摘要)以JSON 包 #package此= JSON.generate({ signed_digest:signed_digest, 數據:數據 }) – noname

+0

不知道我應該如何通過json發送private_encrypted字符串,或者甚至有可能 – noname

+0

您可以用各種方式編碼二進制數據,但一個簡單的方法是base64。只需要'base64',然後使用Base64.encode64對其進行編碼(並對decode64進行解碼)。 –