2015-05-14 70 views
0

我想解密使用Microsoft CryptoAPI的CryptEncrypt函数加密的Java文件。我已经读过:“返回的加密块缓冲区采用小端字节顺序(与上面的Java和.NET的big-endian相比)。”java的ByteOrder小endian大endian不工作?

我正在使用Java中的ByteBuffer和ByteOrder类,并且很确定我做错了,因为无论我尝试什么,我都会得到与System.out.println相同的打印输出以用于beforebytes和afterbytes。

byte [] beforebytes = null; 

// code to extract bytes from file here 

ByteBuffer bb = ByteBuffer.wrap(beforebytes); 

bb.order(ByteOrder.LITTLE_ENDIAN); // BIG_ENDIAN doesn't work either? 

ByteBuffer slice = bb.slice(); 
// 'slice' now refers to the same data, but is supposed to be BIG ENDIAN 

byte[] afterbytes = new byte[bb.capacity()]; 

// transfer bytes from this buffer into the given destination array 
slice.get(afterbytes, 0, afterbytes.length); 

任何帮助将不胜感激!

谢谢 贝特朗

+0

你可以在你的问题的正文中包括你尝试过的东西吗? – Newd

+0

嗨Newd,我试过ByteOrder.BIG_ENDIAN。我尝试过和没有切片。我也尝试了其他明显错误的东西;) –

回答

0

的字节顺序,如果你得到单个字节(或字节数组)移出缓冲区无所谓。只有当您从缓冲区中获得例如16位短值或32位整数值时才重要;在这种情况下,缓冲区中的字节将根据字节顺序进行适当的交换。

例如:

ByteBuffer buf1 = ByteBuffer.wrap(new byte[]{0x01, 0x02, 0x03, 0x04}); 
buf1.order(ByteOrder.LITTLE_ENDIAN); 

int n1 = buf1.getInt(); 
System.out.println(n1 == 0x04030201); 

ByteBuffer buf2 = ByteBuffer.wrap(new byte[]{0x01, 0x02, 0x03, 0x04}); 
buf2.order(ByteOrder.BIG_ENDIAN); 

int n2 = buf2.getInt(); 
System.out.println(n2 == 0x01020304); 
+0

谢谢你的回应。从你的回答中,我了解到切片和容量方法是多余的。但是,将它移到afterbytes字节数组的正确语法是什么? –

1

我用C解决了这个! Java现在可以正确解密由CryptoAPI加密的内容。

我从在CryptoAPI的示例开始了: http://blogs.msdn.com/b/alejacma/archive/2008/01/28/how-to-generate-key-pairs-encrypt-and-decrypt-data-with-cryptoapi.aspx

然后刚写入的加密文本到文件之前,我添加的代码块从参考 CryptoAPI C++ interop with Java using AES

// reverse bytes of pbData for java 
for (unsigned i = 0; i<dwEncryptedLen/2; i++) 
{ 
BYTE temp = pbData[i]; 
pbData[i] = pbData[dwEncryptedLen - i - 1]; 
pbData[dwEncryptedLen - i - 1] = temp; 
} 

基准是为AES但我在RSA中加密。对于解密,我使用算法“RSA/NONE/PKCS1Padding”使用了bouncycastle提供程序。要在Windows 7上安装bouncycastle提供程序,请按照:http://sce.uhcl.edu/yang/teaching/JDK_JCE_environment_Configuration.htm重新启动

希望这会帮助别人。