Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java Android中加密,在C#Unity中解密_Java_C#_Unity3d_Encryption - Fatal编程技术网

在Java Android中加密,在C#Unity中解密

在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

首先,我希望能够在我的一个Java类中加密一些数据,并将其写入手机上的文本文件中。然后我的统一类在c#读取它,解密它和数据可以使用

目前,我的java类可以对自己的数据进行加密和解密。我的C#也能做到这一点。问题是,我的c#代码无法解密java以前加密的内容。我100%确定他们有相同的密钥(打印了一个日志,所以比较一下,结果是一样的)。我的java加密和c加密似乎有些不同

以下是我在尝试用c#解密之前由java加密的内容时遇到的错误:

    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。

找到了解决方案!一切正常

在遵循一些提示后,以下是修复方法:

  • 确保一切都在欧洲央行。在Java中,不需要这样做:

    Cipher Cipher=Cipher.getInstance(“AES/CBC/PKCS7PADDING”)

  • 我只是将其放在crypt和decrypt函数中:

    Cipher cipher = Cipher.getInstance("AES");
    
  • 在C#中,密钥大小和IV大小需要取决于实际的原始密钥和IV数组(不是像32或16这样的任意数字,需要是密钥的实际大小)

  • 现在,我不再向文件中写入字符串,而是直接写入字节,就像加密后直接写入字节一样。这使得C方更容易直接获取所有信息并解密

  • 因此,主要的问题是在文件中写入字符串而不是字节。我不知道这为什么会导致错误(错误:无效块大小


    警告:使用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");