我对将纯java Curve25519函数转换为Python等效函数存在问题,具体问题与将哈希字符串转换为字节等效函数的摘要函数有关,java实现:
数据示例:
sP=“这是一个用于测试目的的密码短语示例”
/**
* Calculate the SHA-256 hash of a string
*
* @param input Data to be hashed
* @return The hash digest
*/
public static byte[] singleDigest(String input) {
byte[] bytes;
try {
bytes = singleDigest(input.getBytes("UTF-8"));
System.out.println("bytes"+bytes);
System.out.println("before singleDigest"+input);
} catch (UnsupportedEncodingException exc) {
bytes = null;
}
return bytes;
}
/**
* Calculate the SHA-256 hash of a byte array
*
* @param input Data to be hashed
* @return The hash digest
*/
public static byte[] singleDigest(byte[] input) {
byte[] bytes;
synchronized (digest) {
digest.reset();
bytes = digest.digest(input);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
sb.append(String.format("%02x", bytes[i] & 0xFF));
}
System.out.println(sb.toString());
}
return bytes;
}
生成此字节输出:
82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121, 71, -54, 73, -75, 54, 31, -33, -49, -68, -16, -19, 125, -61, -116, -82, 96, 50, -35, -119, -28, 25
对于正数和负数,在python端,我使用这个函数将散列字符串转换为字节:
secret = sha256(sP.encode('utf-8')).hexdigest()
sct = ParseHexString(secret).getData()
class ParseHexString(object):
def __init__(self, hex):
"""
"""
if not isinstance(hex, str):
return None
else:
self.hex = hex
self.listOfByte = None
self.run()
def run(self):
if len(self.hex)&0x01 == 1:
return None
lbytes = []
for i in range(0, len(self.hex), 2):
op1, op2 = self.hex[i:i + 2]
oop1 = ord(op1)
oop2 = ord(op2)
char1 = oop1 - 0x57 if oop1 > 0x60 else oop1 - 0x30
char2 = oop2 - 0x57 if oop2 > 0x60 else oop2 - 0x30
if (char1 < 0 or char2 < 0 or char1 > 15 or char2 > 15):
print("Invalid hex number ",op1,op2)
lbytes.append(((char1 << 4) + char2))
self.listOfByte = lbytes
def getData(self):
return self.listOfByte
我在这里使用了列表而不是可变字节数组,因为字节数组(0-256)的内部表示形式不同,一些散列字符串的输出不同,只有正整数:
82, 199, 124, 58, 151, 76, 123, 3, 119, 235, 121, 71, 202, 73, 181, 54, 31, 217, 207, 188, 240, 237, 125, 196, 140, 174, 96, 50, 221, 137, 228, 25
我注意到(256-JavaByteOutput[x]==PythonByteOtput[x])当JavaByteOutput是负数时,问题是,我如何修改ParseHexString类以获得等效的正/负输出,我想要纯python代码,而不需要库。
谢谢你的善意回答问候艾丽克丝
这里的要点是:Java只知道符号类型。
这意味着:虽然Java字节也大约是8位,但范围是从-128到127。无符号字节从0到255。
这就是一切。唯一真正重要的是,你对价值观的处理方式保持一致。有关此主题的更多想法,请参见此处。
在Python中,a%b
总是返回一个与b
具有相同符号的值,该值介于0(包括)和b
(排除)之间。在这种情况下,b
是256。
因此,要将这些值移到范围[-128,128),将每个值加128,取模基数256,然后减去128:
x = [82, 199, 124, 58, 151, 76, 123, 3, 119, 235, 121, 71, 202, 73, 181, 54, 31, 217, 207, 188, 240, 237, 125, 196, 140, 174, 96, 50, 221, 137, 228, 25]
y = [(xi + 128) % 256 - 128 for xi in x]
# [82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121, 71, -54, 73, -75, 54, 31, -39, -49, -68, -16, -19, 125, -60, -116, -82, 96, 50, -35, -119, -28, 25]
因此,在ParseHexString中。运行
定义:
self.listOfByte = [(xi + 128) % 256 - 128 for xi in lbytes]
如果NumPy是一个选项,那么您可以简单地查看
无符号1字节整数作为有符号1字节整数:
import numpy as np
x = np.array([82, 199, 124, 58, 151, 76, 123, 3, 119, 235, 121, 71, 202, 73, 181, 54, 31, 217, 207, 188, 240, 237, 125, 196, 140, 174, 96, 50, 221, 137, 228, 25], dtype='uint8')
x.view('i1')
# array([ 82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121,
# 71, -54, 73, -75, 54, 31, -39, -49, -68, -16, -19,
# 125, -60, -116, -82, 96, 50, -35, -119, -28, 25], dtype=int8)
寻找将此C#代码转换为Java的帮助 我有字节数组,但需要帮助编码到BigInteger的转换。希望为Hadoop创建一个UDF; ////////////////////////////// 我的最后一段代码与SQL Server中的哈希字节匹配:
问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)
如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?
我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页
问题内容: 我想在GO中将字符串数组转换为字节数组,以便可以将其写到磁盘上。将字符串数组()解码为字节数组()的最佳解决方案是什么? 我正在考虑对字符串数组进行两次迭代,第一个迭代以获得字节数组所需的实际大小,然后第二个迭代写入每个元素的长度和实际字符串()。 解决方案必须能够以其他方式进行转换;从一个到一个。 问题答案: 让我们忽略一个事实,那就是走一秒钟。您需要做的第一件事是将序列化格式编组为
说到什么是字符串哈希(Hash)?很多人都会疑惑,我们可以这么理解,定义一个把字符串映射到整数的函数 f,这个 f 称为是Hash函数。而我们希望这个函数 f 可以方便地帮我们判断两个字符串是否相等。 (1)Hash 的思想 Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。 (2)使用场景 当一个字符串规模很大,并且需要多次访问该字符串或者子串的时候,我们可以用哈希函数对每