Java 安卓和服务器的密钥不同

Java 安卓和服务器的密钥不同,java,android,cryptography,bouncycastle,one-time-password,Java,Android,Cryptography,Bouncycastle,One Time Password,我正在使用hotp算法(rfc4226)开发一个一次性密码应用程序。我有一个用于otp生成的Android应用程序(通过模拟器),还有一个用于验证的服务器端应用程序。就其自身而言,这两个机构都运转良好,并通过了测试 但是,我在设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的,并且它们之间是相同的。这会导致在设备和服务器上生成不同的一次性密码,这会破坏我生成有效一次性密码的能力。我想弄清楚为什么会发生这种事,如果有什么我能做的 服务器和设备模拟器之间的代码相同,用于构造加密密钥和从

我正在使用hotp算法(rfc4226)开发一个一次性密码应用程序。我有一个用于otp生成的Android应用程序(通过模拟器),还有一个用于验证的服务器端应用程序。就其自身而言,这两个机构都运转良好,并通过了测试

但是,我在设备上生成的密钥与我在服务器上生成的密钥不同,即使输入是硬编码的,并且它们之间是相同的。这会导致在设备和服务器上生成不同的一次性密码,这会破坏我生成有效一次性密码的能力。我想弄清楚为什么会发生这种事,如果有什么我能做的

服务器和设备模拟器之间的代码相同,用于构造加密密钥和从密钥生成一次性密码。我已经检查了设备和服务器上的密钥规范中的字节,它们是相同的。但是,当我查看secretKey.getEncoded()中的字节时,secretKeyFactorys生成的键(都来自desedeKeySpec)有细微的差异。如果我使用DES而不是三重DES,我会看到类似的差异

有趣的是,在我的Android项目中,KeySpec和生成的SecretKey中的字节是一致的(虽然被截断),但在服务器上,KeySpec和生成的SecretKey之间的字节偶尔会相差一个字节。这正常吗?我读过一些关于使用DES和三重DES时奇偶校验位的变化,所以我不确定这是否是一个问题

我也知道Android使用的是Bouncy Castle,但我的服务器使用的是SunJCE。我的理解是,这不应该是一个问题,我想知道当使用两个不同的提供者时,这是否是一个已知的事件。我获得Bouncy Castle服务器端的能力非常有限


请给我一些建议和启示?

看来其他人已经发现了这个问题,并找到了一个临时解决方案。在生成密钥时,手机上的BC实现和SunJCE处理奇偶校验位的方式不同。看起来Bouncy Castle可能会发布更新来解决此问题:


弹出窗口显示,差异是否仅存在于键的奇偶校验位?您能否给出显示输入和输出的示例?直到明天。