如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题
发表于:2025-02-21 作者:千家信息网编辑
千家信息网最后更新 2025年02月21日,本篇内容介绍了"如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大
千家信息网最后更新 2025年02月21日如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题
本篇内容介绍了"如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
问题描述:
明文"abcdefgHabcdefgH" 用key:"abcdefgH12345678" 加密后的密文应该是 "ec3f23575fea50b2ec3f23575fea50b2。但使用Ruby+openssl的结果是"ec3f23575fea50b2ec3f23575fea50b2 9eda321f26b6909f ", 多出了后面的8字节: 9eda321f26b6909f
# abcdefgHabcdefgH => ["ec3f23575fea50b2ec3f23575fea50b29eda321f26b6909f"](7D8jV1/qULLsPyNXX+pQsp7aMh8mtpCf) key:`abcdefgH12345678` OK # abcdefgHabcdefgH => ["ec3f23575fea50b2ec3f23575fea50b2"](7D8jV1/qULLsPyNXX+pQsg==) key:`abcdefgH12345678` OK
原因:
填充方法的使用问题
解决后的代码:
明文的长度必须是8的整数倍,否则会报错::in `final': data not multiple of block length (OpenSSL::Cipher::CipherError)
require 'openssl'module Des3 # puts OpenSSL::Cipher.ciphers def self.cipher(mode, key , data) # cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').send(mode) # cipher = OpenSSL::Cipher.new('DES-EDE3').send(mode) # 192 bits KEY cipher = OpenSSL::Cipher.new('DES-EDE').send(mode) # 128 bits key # cipher = OpenSSL::Cipher.new('DES3').send(mode) # 192 bits KEY cipher.key = key cipher.padding =0 #!!! 0:加密后不会多出8bytes # key:`abcdefgH12345678`, `abcdefgHabcdefgH`` => `["ec3f23575fea50b2ec3f23575fea50b2"]`(7D8jV1/qULLsPyNXX+pQsg==) OK # key:`abcdefgH12345678`, `abcdefgHabcdefgH`` => `["ec3f23575fea50b2ec3f23575fea50b29eda321f26b6909f"]`(7D8jV1/qULLsPyNXX+pQsp7aMh8mtpCf) OK encrypted = '' encrypted << cipher.update(data) encrypted << cipher.final encrypted end def self.encrypt(key, data) cipher(:encrypt, key, data) end def self.decrypt(key, data) cipher(:decrypt, key, data) endenddef test_case(dat) key, data, dataExpected = dat[:key], dat[:data], dat[:dataExpected].downcase.gsub(" ","") dataEnrypted = Des3::encrypt(key ,data) dataDecrypted = Des3::decrypt(key ,dataEnrypted) print("key:`#{key}` `#{data}` => 0x:#{dataEnrypted.unpack("H*")[0]} #{dataDecrypted==data ? 'OK' : "FAIL"} #{dataExpected==dataEnrypted.unpack("H*")[0] ? 'OK' : "FAIL(Expected:#{dataExpected})"} \n") puts " key0x:#{key.unpack("H*")[0]}, 0x:#{data.unpack("H*")[0]} => 0x:#{dataEnrypted.unpack("H*")[0]} #{dataDecrypted==data ? 'OK' : 'FAIL'} #{dataExpected==dataEnrypted.unpack("H*")[0] ? 'OK' : 'FAIL'} "enddef unit_test dat1=[ {key:"abcdefgH12345678", data:"abcdefgHabcdefgH", dataExpected:"ec3f23575fea50b2ec3f23575fea50b2"}, {key:"\x12\x34\x56\x78\x90\x12\x34\x56\xab\xcd\xef\x12\x34\x56\x78\x90",data:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",dataExpected:"c4 fe a9 c5 6c 89 64 11 c4 fe a9 c5 6c 89 64 11"}, ] dat1.each do |dat| test_case(dat) endendunit_test
运行结果
key:`abcdefgH12345678` `abcdefgHabcdefgH` => 0x:ec3f23575fea50b2ec3f23575fea50b2 OK OK key0x:61626364656667483132333435363738, 0x:61626364656667486162636465666748 => 0x:ec3f23575fea50b2ec3f23575fea50b2 OK OKkey:`4Vx�4V���4Vx�` ` ` => 0x:c4fea9c56c896411c4fea9c56c896411 OK OK key0x:1234567890123456abcdef1234567890, 0x:00000000000000000000000000000000 => 0x:c4fea9c56c896411c4fea9c56c896411 OK OK
"如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
问题
加密
字节
内容
明文
更多
知识
结果
实用
学有所成
接下来
代码
原因
困境
实际
密文
情况
整数
文章
方法
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
信息技术网络技术应用大题
数据库多连接并发查询
数据库系统概论 第...
基本农田数据库标准
数据库数据项意思
服务器间网络通讯错误是怎么回事
用流量连接不到服务器
色弱可以用计算机网络技术吗
网络安全法保护等级
京东外包软件开发岗待遇怎么样
自建邮箱服务器能发到qq吗
思科网络技术学院是干什么的
无锡猛龙网络技术
深圳腾讯招聘软件开发
数据库的次数据库是什么
世界上网络技术最发达的国
光功率气象预测服务器作用
信息安全 网络技术考哪个好
网络安全圈运营
下面哪个或者哪些是网络安全协议
mw服务器公告
数据库完整性不包括的类型是
资格证考试作文网络安全
奇妙软件开发有限公司在哪
考研数据库技术移民
怎样用数据库建立文件
网络安全小常识100条20
我的世界百万年魂环租赁服务器号
淄博供应链软件开发定制开发
网络安全与服务业