当前位置: 首页 > 知识库问答 >
问题:

将iSeries加密API与BouncyCastle一起使用

钮出野
2023-03-14

我正在尝试加密C#客户端和iSeries服务器之间的通信,但遇到了一些问题。我正在尝试使用Diffie Hellman创建共享秘密,但共享秘密不匹配。

我在C#中使用Bouncy Castle,在iSeries上使用QC3*API。步骤是:

  1. C# 客户端生成 DH 参数,并将其与客户端公钥一起发送到服务器。
  2. C服务程序对参数进行解码,调用QC3GENDK创建服务器公钥。
  3. 服务器使用客户端公钥调用 QC3CALDS 以生成共享密钥。
  4. 服务器公钥被发送回客户端。
  5. 使用客户端私钥初始化的充气城堡基本 DH 协议
  6. 客户端使用从步骤 1 中的参数和服务器公钥生成的 DHPublicKey 参数调用 CalculateAgreement。

数据来回发送的方式是转换成十六进制字符串并在每一端解码。EBCDIC和ASCII之间的转换发生在iSeries上的服务程序中。例如,客户端公钥转换如下:

>

  • 公钥(作为BigIntger)转换为无符号字节数组,例如256-

    cvtch( %Addr (@clientKey ): %Addr(data4): 128);
    eval @clientKey = %Subst( @clientKey: 1: 64);
    

    其中:

    data4-十六进制字符串

    @clientKey - 64A 接收器可变

    服务器密钥通过以下方式转换为十六进制:

    > < li>

    在服务器上转换为十六进制字符串

    cvthc ( %Addr( @serverKeyHex ): %Addr(@serverKey): 128);
    eval @serverKeyHex = %Subst(@serverKeyHex: 1: 128);
    

    其中:

    @serverKey是64A serverKey

    @serverKeyHex是128A接收器变量

    将HEX字符串发送到C#客户端

    通过将十六进制字符串解释为BigInteger

    var server key = new big integer(server hex,16);

    所以,共享的秘密是不匹配的,但是我不知道这是否与我如何解释密钥或者发送它们有关。感谢任何建议。

    编辑:举一个具体的例子:

    对于十六进制为:4F58E1463B66CAAC1BDD35C518A6B76E52E0464E6350B50C87329CFC4C154B8EA07B12AF0E0B9754D5331235805CF59ABE1BB500B4906BD03BCF6C7861E2E8的客户端公钥

    EDIT2(更多信息):在iSeries上的API调用(在C中)可以在这个gist:https://gist.github.com/ximenean/a0a9193b776f301997bb中看到

  • 共有1个答案

    宗晟
    2023-03-14

    我不知道C#端发生了什么转换,但RPG/MI端正在从字符串转换为字符串。取一个EBCDIC字符串'ABCD'这是一个完全有效的4字节二进制数,以及一个完全有效的4字节字符。在EBCDIC CCSID 37(美国英语)中,此字符串的代码点为x'C1C2C3C4'。

    CVTCH将生成以下字符串:“C1C2C3C4”也就是说,它接受一个4字符的字符串并将其“转换”为8字符的字符串。在CCSID 37中,即x'C3F1C3F2C3F3C3F4'。如果您将此字符串发送给在ASCII中解释此字符串的客户端,它的解释将非常不同,因为ASCII的代码点x'C1C2C3C4'是ASCII字符串 'ÁÂÃÄ'

    在从IBM端发送之前,您可能希望将其转换为ASCII。“C1C2C3C4”将成为“41424344”等等。

     类似资料:
    • 当我想在Java中使用带有BouncyCastle API的RSA加密文件时,我遇到了一个问题。问题如下:在下面的代码中,我在其中创建一个RSAKeyParameters对象的行中,它的构造函数询问我三个参数: 1。如果我们想用公钥或私钥加密 2。具有键的模的BigInteger 3。具有键的指数的BigInteger。 我的方法接收的第一个参数是包含密钥的文件。在RSAKeyParameter的

    • 案例:我正在维护一个Java小程序,它使用BouncyCastle库bcpkix-jdk15on-149。jar和bcprov-jdk15on-149。罐子 问题是小程序在启用JRE版本7\u u40的浏览器上运行时 该行为与版本7\u u25不同,它总是会提示一个模式窗口,如“使用自签名证书的应用程序的安全提示”(无法永久隐藏),只是为了信任bcprov。 https://www.java.co

    • 加密(不工作): “dost't work”的意思是-它返回一个加密的字符串,该字符串绝不是CF加密的字符串的镜像。最重要的是,当使用上述方法解密时,返回的字符串与最初输入的字符串不匹配(使用.NET/BouncyCastle加密)

    • 我目前正在将我的C#AES-GCM密码代码转换为PHP。然而,经过一些研究,我的PHP系统加密的文本不能被C#one解密。我想知道这两种代码是否有区别: C#带弹跳壳: 下面是PHP系统: 有没有人能告诉我,PHP代码中是否有遗漏或不同之处,导致它们的工作方式有所不同?或者PHP函数和BouncyCastle函数之间是否存在某种内部差异,从而使它们有所不同?

    • 问题内容: 我对 密码学还很陌生 ,我正在使用它来 加密 密码并将其存储在数据库中。对于 加密, 我正在使用算法,并且希望对密码加盐以防止再次发生字典攻击。 任何帮助,将不胜感激。 问题答案: 我建议为此使用基于密码的密钥派生函数,而不是基本的哈希函数。像这样:

    • 我对密码学相当陌生,我正在使用加密密码并将其存储在数据库中。对于加密,我使用算法,并且我想对密码加盐,以防止它对字典攻击。 如有任何帮助,我们将不胜感激。