如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"如何解决Ruby+OpenSSL 3DES加密后多了8字节的问题"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大
千家信息网最后更新 2026年11月02日如何解决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安全错误
数据库的锁怎样保障安全
深圳市人人互联网科技有限公司
科技互联网企业
云信互联网科技有限公司
互联网科技工作委员会毛军
金融科技还是互联网
美国互联网科技
猪兼强互联网科技
艾特科技互联网
狮子座互联网科技培训
多迪互联网科技有限公司
互联网科技大会案例
互联网公司会议桌创意科技软装饰
承德科技产业互联网发展
重庆威客帮互联网科技
河南住房之家互联网科技
高科技互联网发展前景如何
互联网科技公司营业执照怎么办理
上海科技产业互联网平台
雨阳互联网卡科技有限公司
科技发展第三阶段互联网时代
互联网金融科技
互联网新科技
互联网科技公司发展
无线互联网科技
一五八零互联网科技
昭通互联网科技选哪家
移动互联网科技公司
互联网金融科技展
雨阳互联网卡科技有限公司
广州梦谷互联网科技有限公司领导