使用 Ruby 1.8.6。
我正在编写一个基本服务器,该服务器回显从客户端发送的消息的加密版本,以了解 Ruby 中对称加密的实现。该程序旨在接受套接字连接,共享其密钥,然后对其接收的数据进行加密,然后将其发送回客户端程序。然后,客户端使用共享密钥解密该消息,从而显示回显的消息。
我遇到的问题是返回消息导致“错误的最终块长度(OpenSSL::CipherError)”。进一步检查问题,删除decrypted << chiper.final允许我的客户端程序解密消息,但在末尾添加额外的字符或银行空格。我知道这是因为final关键字删除了额外的填充以允许 CBC 模式的 16 位块加密/解密,但我不知道如何正确工作。
这是简化的服务器代码(我知道这不安全,那不是重点,这只是一个学习应用程序)
require 'socket'
require 'thread'
require 'openssl'
require 'digest/sha1'
class Server
@@static_id = 1
@connection_no
@port
@server
@aes_cipher
@key
def initialize(p)
#setting up server connections
puts "Starting server"
@port = p
puts "connections on port #{@port} will be accepted"
@server = TCPServer.open(@port)
#generate a secret key
puts "creating secret key..."
@aes_cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
@aes_cipher.encrypt
@key = @aes_cipher.random_key
@aes_cipher.key = @key
puts "key: #{@key}" …Run Code Online (Sandbox Code Playgroud)