【问题标题】:Convert plaintext to perform elgamal encryption转换明文以执行 elgamal 加密
【发布时间】:2015-06-04 15:06:09
【问题描述】:

您好,我正在用 java 编写一个程序来测试 elgamal 加密的变体,但是我的问题不是 encryption/decryption 链本身,而是如何对给定的输入执行操作:文本文件。我有一个包含一些单词的文本文件(例如内容可以是:"Hello world, this is a test"),我需要像这样对它们执行数字运算:

ciphertext= (message * y) mod p

其中yp 是两个biginteger。我试过这个转换链:(一次读取一个字符串):

字符串->十六进制->十进制

然后执行加密操作,再逆向:

十进制->十六进制->字符串

但这并不总是有效(我目前正在调查这个问题)。已修复。

我的问题是,有更好的方法吗?我正在阅读有关 byte array 的信息,但我不确定如何使用它们。

[如果需要,我可以发布加密/解密链的示例]

【问题讨论】:

  • “但这并不总是有效”- 我们如何知道哪个时间有效,哪个时间无效?显示您的代码,以便我们了解问题出在哪里。
  • @rakeb.void 我目前正在调查这个问题,但是对于大素数(>1024 位),它的测试速度并不快(请记住,即使是纯文本中的一个简短单词也很漂亮转换为整数时的大数。例如,单词“hello”等于“448378203247”)。我不认为我的转换链很好,但这是我想到的唯一解决此问题的方法,但是我的问题仍然悬而未决。

标签: java encryption elgamal


【解决方案1】:

BigInteger 有一个 constructor 以字节数组作为参数。

使用(例如)UTF-8 编码,任何字符串都可以无损失地转换为字节数组:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8); 

将两者结合起来,您就可以轻松地将 String 转换为 BigDecimal。

对于反向操作,使用BigInteger.toByteArray(),然后使用new String(bytes, StandardCharsets.UTF_8)

【讨论】:

  • 谢谢,我想这就是我想要的,现在我可以跳过十六进制转换。但是,我做了一些测试,它不适用于一些特殊字符,如“蔓ò”等(我的十六进制解决方案也遇到了这个问题)。我认为这是因为 StandardCharsets UTF_8 但我对这种事情不熟悉,所以我不确定。有什么想法可以解决这个问题?
  • 它确实适用于重音。如果不是,则可能意味着您的源文件编码与用于编译代码的编码不匹配。到处使用 UTF8 (javac -encoding UTF-8)。
  • 我用记事本创建了一个 txt 文件,我选择了 UTF-8 编码,但它不适用于像“è”这样的字符。然后我尝试不使用文件,使用来自用户控制台的输入:Scanner user_input = new Scanner(System.in);文本= user_input.next();但这也不起作用。在第一种情况下,问题可能是我用来读/写文件的方式,但是对于来自控制台的输入,我不知道为什么它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2013-11-27
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多