首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Turbopower Lockbox3 -我可以控制初始化向量和填充AES-256加密吗?

Turbopower Lockbox3 -我可以控制初始化向量和填充AES-256加密吗?
EN

Stack Overflow用户
提问于 2012-06-01 09:30:17
回答 1查看 3.5K关注 0票数 2

在从Delphi2007到XE2的过程中,我们正在考虑将加密库从DCPCrypt切换到Turbopower 3。

( a)在DCPCrypt中,我对初始化向量有显式控制。我将如何在TPLB3中设置IV?

( b) DCPCrypt没有填充,我们在加密前用零填充明文。TPLB是怎么实现的?当然,我们还是可以自己做的。

测试向量

密码= AES-256;

  • Chaining模式= CBC;

  • Termination = C#样式的all-zero-padding;

  • IV传输=在密文流中加满块。

  • Key= 33d46cffa158533194214a91e712fc2b45b587076675affd910edeca5f41ac64 little-endien

  • IV = 917fe226df8308f4d96c33304768354a

  • Ciphertext = +kdTGzdV5KZIw8tv466nhQ== (base64)

  • Plaintext = 'a_decent_text‘(ansistring)

谢谢简

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-03 12:13:03

a) IV

让我在序言中说,你可能试图解决一个不需要解决的问题。锁箱3是自动加盐的.这意味着,在大多数情况下,64位nonce被自动生成并插入到IV中。其结果是,您可以不用编写一行代码就可以使用TCodec组件来管理IV,而且您仍然可以获得盐渍的所有加密好处(基本上意味着不可预测的IV)。这与DCPCrypt形成了鲜明的对比,在这里,您可以对IV进行归零,也可以自行管理IV。

除了“已知测试答案”测试之外,我无法想象有一个场景是您希望或需要覆盖此行为的,但话虽如此,如果您确实希望设置您自己的IV,如果您有一个cvs客户端,您可以下载修订版231 (尚未“稳定发布”状态),并实现TCodec组件的OnSetIV()事件处理程序,将IV设置为您的自定义值。由于IV是与消息一起发送的,因此在解密时不需要此步骤。

如果你想要一些演示代码,请告诉我。

( b)填充(从第一篇文章中修正)。对不起,错了。)

这取决于链接方法。当使用标准流到块适配器时,在下列情况下将处理终止。

  • Zero长度messages

零长度消息被加密为零长度密文。

  • ECB mode

对于欧洲央行模式,Lockbox 3采用ISO/IEC 9797-1方法2填充.ISO/IEC 977-1方法2实质上是一个字节的衬垫,值$80,然后是达到下一个块边界所需的零字节数。

  • Not欧洲央行,但消息是块aligned

没有垫子。不需要特殊的终止处理。

  • Key-streaming模式(如OFB)

没有垫子。终止由截断处理。

  • Other (如CBC)

没有垫子。终止是通过窃取密文来处理的,这“对学校来说太酷了”!如果消息太短,不能窃取密文(小于2个块),则自动切换到CFB-8位,并将其视为密钥流。

更新

警告

LockBox 3从未设计用于与CSharp风格的用户管理IV和全零填充的互操作性.(国际水文学组织,这种填充物是有问题的,应该避免)。

下面的代码片段演示如何从注释中给出的测试向量解密LockBox3。假定密文流与完整的IV相加,并且加密编解码器使用(令人讨厌的)全零填充。

代码语言:javascript
复制
procedure TForm5.Button1Click(Sender: TObject);
const
  Key: ansistring = #$33#$d4#$6c#$ff#$a1#$58#$53#$31#$94#$21#$4a#$91#$e7#$12#$fc#$2b +
                       #$45#$b5#$87#$07#$66#$75#$af#$fd#$91#$0e#$de#$ca#$5f#$41#$ac#$64;
  Reference_Plaintext: ansistring = 'a_decent_text';
  IV: ansistring = #$91#$7f#$e2#$26#$df#$83#$08#$f4#$d9#$6c#$33#$30#$47#$68#$35#$4a;
var
  Stream, ReconStream: TStream;
  Cipherb64: ansistring;
  Recon_Plaintext: ansistring;
begin
Stream := TMemoryStream.Create;
Stream.WriteBuffer( Key[1], Length( Key));
Stream.Position := 0;
CryptographicLibrary1.RegisterStreamCipher( StreamToBlock_Adapter_CSharpVariant);
Codec1.StreamCipherId := 'CSharp.StreamToBlock';
Codec1.BlockCipherId  := Format( AES_ProgId, [256]);
Codec1.InitFromStream( Stream);
Stream.Size := 0;
Stream.WriteBuffer( IV[1], Length( IV));
Cipherb64 := '+kdTGzdV5KZIw8tv466nhQ==';
Base64_to_stream( Cipherb64, Stream);
ReconStream := TMemoryStream.Create;
Stream.Position := 0;
Codec1.DecryptStream( ReconStream, Stream);
ReconStream.Position := 0;
SetLength( Recon_Plaintext, ReconStream.Size);
ReconStream.ReadBuffer( Recon_Plaintext[1], Length( Recon_Plaintext));
SetLength( Recon_Plaintext, StrLen( PAnsiChar( Recon_Plaintext)));
ReconStream.Free;
Stream.Free;
if Recon_Plaintext = Reference_Plaintext  then
    ShowMessage( 'Test passed! LockBox3 decrypts from CSharp-style zero padding.')
  else
    ShowMessage( 'Test failed!')
end;

值得注意的一点是:

  1. 假定您已经预先创建了TCodec和TCryptographicLibrary (暗示性命名),可能是在设计时在表单上创建的。TCodec的链接模式
  2. 和其他属性已经在设计时设置了。对于我们的测试向量,它应该设置为CBC。
  3. 给定的流到块适配器是一个特殊的适配器,通常不在密码库中。这就是为什么有一行代码可以显式注册它。
  4. 您需要一个CVS客户端来从TurboPower LockBox 3 CVS存储库下载最新的修订版。这个适配器还没有正式稳定的release.
  5. Using这个适配器,你只能解密。与CSharp兼容的加密还不可用.
  6. 我在Delphi2007和Delphi2010上测试了它。它对我有用。

更正

maxiumum短消息长度,即对于经典密文流来说被视为太短的明文消息的最大长度,以及作为密钥流(CFB 8位)的链接模式,比一个块少一个字节(不少于前面所说的“两个块”)。一个半块消息仍然可以使用密文窃取作为其块量化方法。半块消息不能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10847759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档