在Java Android中加密,在C#Unity中解密
首先,我希望能够在我的一个Java类中加密一些数据,并将其写入手机上的文本文件中。然后我的统一类在c#读取它,解密它和数据可以使用 目前,我的java类可以对自己的数据进行加密和解密。我的C#也能做到这一点。问题是,我的c#代码无法解密java以前加密的内容。我100%确定他们有相同的密钥(打印了一个日志,所以比较一下,结果是一样的)。我的java加密和c加密似乎有些不同 以下是我在尝试用c#解密之前由java加密的内容时遇到的错误:在Java Android中加密,在C#Unity中解密,java,c#,unity3d,encryption,Java,C#,Unity3d,Encryption,首先,我希望能够在我的一个Java类中加密一些数据,并将其写入手机上的文本文件中。然后我的统一类在c#读取它,解密它和数据可以使用 目前,我的java类可以对自己的数据进行加密和解密。我的C#也能做到这一点。问题是,我的c#代码无法解密java以前加密的内容。我100%确定他们有相同的密钥(打印了一个日志,所以比较一下,结果是一样的)。我的java加密和c加密似乎有些不同 以下是我在尝试用c#解密之前由java加密的内容时遇到的错误: 03-22 13:32:57.034 14264 1
03-22 13:32:57.034 14264 14351 E Unity : CryptographicException: Bad PKCS7 padding. Invalid length 197.
03-22 13:32:57.034 14264 14351 E Unity : at Mono.Security.Cryptography.SymmetricTransform.ThrowBadPaddingException (PaddingMode padding, Int32 length, Int32 position) [0x00000] in <filename unknown>:0
03-22 13:32:57.034 14264 14351 E Unity : at Mono.Security.Cryptography.SymmetricTransform.FinalDecrypt (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) [0x00000] in <filename unknown>:0
03-22 13:32:57.034 14264 14351 E Unity : at Mono.Security.Cryptography.SymmetricTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) [0x00000] in <filename unknown>:0
03-22 13:32:57.034 14264 14351 E Unity : at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (System.Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) [0x00000] in <filename unknown>:0
03-22 13:32:57.034 14264 14351 E Unity : at GoogleReader.Decrypt (System.String text) [0x00000] in <filename unknown>:0
C#代码:
在C中加密和解密字符串的测试#
在Java中加密和解密字符串的测试
Original String : Hello World
Crypted : zQjSpJqU8YkHhMDHw8wuTQ==
Decrypted : Hello World
这些测试中的关键点是:
FuVf/CNYkHdyBqejq3eoHQ==
如您所见,它们具有相同的密钥,但对数据的加密方式不同。我似乎不知道我做错了什么。您的C#代码处于ECB模式,但您的Java代码处于CBC模式
你是真的写了你的代码还是只是复制粘贴?看起来是后者。不要复制和粘贴安全代码。你应该用意图和理解来写它。不是“哦,看这里,我会把它放在一起,希望它能起作用”
而且,你处理静脉注射的方式非常不安全。永远不要使用固定静脉输液器。在适当的情况下,它可以完全显示你的明文。在每次加密操作中使用随机生成的IV。找到了解决方案!一切正常 在遵循一些提示后,以下是修复方法:
Cipher cipher = Cipher.getInstance("AES");
警告:使用ECB模式是不安全的,在某些情况下,检索纯文本很简单。不要在生产或任何需要安全性的场景中使用此代码。在Java实现中AES块和密钥大小是否不同?我怎么知道这一点。在我的帖子中,您可以看到我用于加密和解密的Java代码。这是一个函数,我将字符串写入一个文件,这个文件是我从互联网上的多篇关于Javan和C#加密的文章中获得灵感的。两天后,我终于让它分别在两个平台上工作。现在我需要让它们一起工作,但我仍在学习Java和C#中的加密实现。您将如何将我的Java代码完全更改为CBC格式?请注意,这不是要发布的应用程序,也不是要发布的官方应用程序。这是我正在做的一个原型。如果你需要问,你显然不理解代码。仔细阅读两种语言的每一部分,了解每一行的实际功能,应该会发现问题所在。我理解每一步,我的评论都是法语的,所以我删除了它们。在C#中,您可以指定块大小、填充和模式等。您可以直接说,我需要将密码定义中的AES/CBC/PKCS7PADDING替换为AES/ECB/PKCS7PADDING。这确实不是您需要做的。您希望两者都处于CBC模式,而不是ECB模式。ECB模式不安全,不客气。我不是想说得太苛刻,我知道你还在学习。当涉及到与安全相关的代码时,非常迂腐是很重要的。我试图鼓励人们在自己动手之前尽可能深入地学习这门学科。希望你能理解。祝你好运
Original String : Hello World
Crypted : zQjSpJqU8YkHhMDHw8wuTQ==
Decrypted : Hello World
FuVf/CNYkHdyBqejq3eoHQ==
Cipher cipher = Cipher.getInstance("AES");