Solaris上的AES_ctr128_encrypt不会像其他操作系统那样解密

时间:2014-04-26 05:12:44

标签: openssl aes endianness encryption-symmetric

我已经从openssl-1.0.1g为各种平台编译了libcrypto.so共享库。使用共享库,我的应用程序能够在以下任何一项之间加密/解密数据:

  • Linux i386
  • Linux x86_64
  • Linux PPC
  • AIX RISC

这些可以解密他们自己的数据,但不能彼此解密,也不能解密上述任何数据:

  • Solaris i386
  • Solaris SPARC

我首先认为这是一个endian问题,但是AIX / RISC和Linux / PPC都是BE,它们似乎与Linux i386和x86_64(LE)配合得很好。

Solaris系统是:

SunOS pluto 5.9 Generic_Virtual sun4u sparc SUNW,SPARC-Enterprise-T5120
SunOS nemo 5.9 Generic_118559-11 i86pc i386 i86pc

libcrypto.so编译为:

#[openssl-1.0.1g] ./Configure solaris-sparcv9-cc shared 
#[openssl-1.0.1g] ./Configure solaris-x86-cc shared

请注意,Solaris系统都使用“/ opt / SUNWspro / bin / cc”作为编译器,其他所有使用“gcc”。

我已经确认在加密和解密时我总是使用相同的IV /计数器和symkey。加密例程很好地嵌入到我的程序中,但这基本上就是我正在做的所有事情:

uchar ivec[AES_BLOCK_SIZE], ecount[AES_BLOCK_SIZE], symkey[16];
uint num = 0, bits = 128;
uchar *buf, *ebuf; /* these are malloc'd and buf set to data to encrypt/decrypt */
...
memcpy(symkey, MYTESTKEY, 16);
memset(ecount, 0, AES_BLOCK_SIZE);
memset(ivec, 0, AES_BLOCK_SIZE);
memcpy(ivec, SOMEDATA, 8); /* from RAND_seed() and RAND_bytes() */
AES_set_encrypt_key(symkey, bits, &outkey);
...
AES_ctr128_encrypt(inp, outp, bytes, key, ivec, ecount, &num);

同样,这在同一系统上加密/解密时总是有效,只有当其中一个系统是Solaris时才解码为垃圾。我使用的是非常旧的Solaris OS和盒子,因为我必须保持向后兼容性。 提前致谢!

2 个答案:

答案 0 :(得分:1)

请使用更高端的OpenSSL EVP功能。

由其中一个核心开发人员检查实例this message

  

无法保证低级密码上下文(或实际上任何类似的密码)   context)在各个平台上都是一样的。 Endian差异,填充和   平台特定的优化可能导致机器上的不同数据   水平。在适当的平台上使用上下文的结果应该   显然是一致的。

答案 1 :(得分:0)

为了更新,我转换为EVP,但没有区别。我使用GCC重新编译libcrypto.so也没有区别(使用solaris64-sparcv9-gcc) - 直到我从/ usr / bin删除了cc的链接。然后我再次使用GCC重新编译,这次它起作用了。我没有时间进一步调查,但它暗示一些对象仍在用cc编译,即使在指定* -gcc之后也是如此。不幸的是,我们的旧Solaris-x86 V9系统没有GCC可用,因此我们不再支持在intel上使用V9。

相关问题