0

そのため、JSON を使用してクライアントとサーバー間でメッセージを送信する安全なメッセージング スクリプトを作成しました。ある時点で、SHA1 を使用して署名付きメッセージ ダイジェストを生成しています。これにより、JSON.generate で解析できないいくつかの文字が得られ、JSON 形式でメッセージを送信できます。このエラーを回避するのを手伝ってくれる人はいますか?

私が抱えている主な問題は、このコードのセクションにあります。

#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
4

1 に答える 1

1

#hexdigestの代わりに使用すると#digest、16 進数が得られます。現在、バイナリを JSON にエンコードしようとしており (#digestそれが返されるため)、エンコードの失敗が発生しています。

于 2013-07-12T15:40:28.897 に答える