将 Kyber.Point 转换为字节或使用 Kyber.Point 提取字节

2024-02-06

如何转换Kyber.Point https://pkg.go.dev/go.dedis.ch/kyber#section-readme在 Golang 中输入字节或提取字节?

我希望与 HMAC 一起使用的密钥 (ECDH) 具有哈希密钥。

Code:

package main

import (
    "crypto/hmac"
    "crypto/rand"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "math/big"

    "go.dedis.ch/kyber/v3/group/edwards25519"
    "go.dedis.ch/kyber/v3/util/random"
)

var rng = random.New()

func GenerateRandomASCIIString(length int) (string, error) {
    result := ""
    for {
        if len(result) >= length {
            return result, nil
        }
        num, err := rand.Int(rand.Reader, big.NewInt(int64(127)))
        if err != nil {
            return "", err
        }
        n := num.Int64()
        if n > 32 && n < 127 {
            result += string(n)
        }
    }
}
func main() {

    suite := edwards25519.NewBlakeSHA256Ed25519()

    X := suite.Point().Pick(rng)
    Y := suite.Point().Pick(rng)
    a := suite.Scalar().Pick(suite.RandomStream())
    b := suite.Scalar().Pick(suite.RandomStream())

    fmt.Printf("Titik yang disepakati Alice dan Bob :\n X:\t%s\n Y:\t%s\n\n", X, Y)
    fmt.Printf("Kunci Private Alice:\n %s\n\n", a)
    fmt.Printf("Kunci Private Bob:\n %s\n\n", b)

    aX := suite.Point().Mul(a, X)
    aY := suite.Point().Mul(a, Y)

    bX := suite.Point().Mul(b, X)
    bY := suite.Point().Mul(b, Y)

    //Punya Alice
    abX := suite.Point().Mul(a, bX)
    abY := suite.Point().Mul(a, bY)

    //Punya Bob
    baX := suite.Point().Mul(b, aX)
    baY := suite.Point().Mul(b, aY)

    fmt.Printf("Kunci Rahasia Alice:\n abX : %s\n abY : %s\n\n", abX, abY)
    fmt.Printf("Kunci Rahasia Bob:\n baX : %s\n baY : %s\n", baX, baY)

    data := "data"

    h := hmac.New(sha256.New, abX)

    h.Write([]byte(data))

    sha := hex.EncodeToString(h.Sum(nil))

    fmt.Println("Hasil Hash Alice: " + sha)

    g := hmac.New(sha256.New, baY)

    g.Write([]byte(data))

    sha2 := hex.EncodeToString(g.Sum(nil))

    fmt.Println("Hasil Hash Bob: " + sha2)
}

运行代码时出现以下错误:

./prog.go:77:15: cannot use abX (type kyber.Point) as type []byte in argument to hmac.New
./prog.go:90:15: cannot use baY (type kyber.Point) as type []byte in argument to hmac.New

我想要 abX/abY 和 baX/baY 为 Byte 类型。


如果您指的是kyber https://pkg.go.dev/go.dedis.ch/kyber

Point https://pkg.go.dev/go.dedis.ch/kyber#Point这个库的接口有一个Data返回嵌入字节数据的方法。

方法签名:Data() ([]byte, error).

Since abX and baY都是Point输入可以直接调用Data方法来检索字节。

package main

import (
    "crypto/hmac"
    "crypto/rand"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "math/big"

    "go.dedis.ch/kyber/v3/group/edwards25519"
    "go.dedis.ch/kyber/v3/util/random"
)

var rng = random.New()

func GenerateRandomASCIIString(length int) (string, error) {
    result := ""
    for {
        if len(result) >= length {
            return result, nil
        }
        num, err := rand.Int(rand.Reader, big.NewInt(int64(127)))
        if err != nil {
            return "", err
        }
        n := num.Int64()
        if n > 32 && n < 127 {
            result += string(n)
        }
    }
}
func main() {

    suite := edwards25519.NewBlakeSHA256Ed25519()

    X := suite.Point().Pick(rng)
    Y := suite.Point().Pick(rng)
    a := suite.Scalar().Pick(suite.RandomStream())
    b := suite.Scalar().Pick(suite.RandomStream())

    fmt.Printf("Titik yang disepakati Alice dan Bob :\n X:\t%s\n Y:\t%s\n\n", X, Y)
    fmt.Printf("Kunci Private Alice:\n %s\n\n", a)
    fmt.Printf("Kunci Private Bob:\n %s\n\n", b)

    aX := suite.Point().Mul(a, X)
    aY := suite.Point().Mul(a, Y)

    bX := suite.Point().Mul(b, X)
    bY := suite.Point().Mul(b, Y)

    //Punya Alice
    abX := suite.Point().Mul(a, bX)
    abY := suite.Point().Mul(a, bY)

    //Punya Bob
    baX := suite.Point().Mul(b, aX)
    baY := suite.Point().Mul(b, aY)

    fmt.Printf("Kunci Rahasia Alice:\n abX : %s\n abY : %s\n\n", abX, abY)
    fmt.Printf("Kunci Rahasia Bob:\n baX : %s\n baY : %s\n", baX, baY)

    data, err := abX.Data()
    if err != nil {
      fmt.Println("Someting went wrong while extracting bytes")
    }
    fmt.Printf("DATA: %+v", data);

    h := hmac.New(sha256.New, data)

    h.Write([]byte(data))

    sha := hex.EncodeToString(h.Sum(nil))

    fmt.Println("Hasil Hash Alice: " + sha)

    data, err = baY.Data()
    if err != nil {
      fmt.Println("Someting went wrong while extracting bytes")
    }
    fmt.Printf("DATA: %+v", data);

    g := hmac.New(sha256.New, data)

    g.Write([]byte(data))

    sha2 := hex.EncodeToString(g.Sum(nil))

    fmt.Println("Hasil Hash Bob: " + sha2)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Kyber.Point 转换为字节或使用 Kyber.Point 提取字节 的相关文章

  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • Java Web Start 的证书已过期

    JWS 对代码签名证书过期有何反应 根据我的观察 它似乎忽略了 CA 签名证书的到期日期 但我想找到一些确凿的证据 例如官方文档 来证实这一点 如果签名的 jar 被赋予时间戳 来自时间戳权威 那么即使在证书过期之后签名仍然有效 假设时间戳
  • 使用 2 个不同的哈希函数是检查文件完整性的好方法吗?

    我有一个网站 用户可以上传他们的文件 它们存储在服务器上 其元数据记录在数据库中 我正在实施一些简单的完整性检查 即 该文件的内容现在逐字节与上传时是否相同 示例 对于内容userfile jpg MD5 哈希为39f9031a154dc7
  • Go 指针 - 通过指针将值附加到切片

    我有一个 struct ProductData 及其实例 p 它有一个切片属性 type ProductInfo struct TopAttributes map string interface 我想设置 TopAttributes 如下
  • 共享 GOPATH 的良好做法是什么?

    我刚刚开始学习 Go 并阅读现有代码以了解 其他人是如何做的 在这样做时 go 工作空间 的使用 特别是当它与项目的依赖项相关时 似乎无处不在 在处理各种 Go 项目时 使用单个或多个 Go 工作区 即 GOPATH 的定义 的常见最佳实践
  • 160 位 SHA1 哈希值的前 32 位是否可以替代 CRC32 哈希值?

    我正在开发一个 NET 3 5 项目 我需要一个 32 位哈希值 NET 加密类中似乎没有任何方法返回 32 位哈希 MD5 是 128 位 SHA1 是 160 位等 我实现了一个 CRC32 类 但我发现现有的 SHA1 和 MD5 哈
  • 如何在 AES 加密中使用随机数进行解密

    我是密码学新手 我需要使用 AES 和一些配置来加密文本 Encryption mode GCM Key size 256 bits Nonce size 96 bits MAC size 128 bits 由于 AES 是一种对称算法 所
  • 在 OSX 上交叉编译 Go?

    我正在尝试在 OSX 上交叉编译 go 应用程序以构建适用于 Windows 和 Linux 的二进制文件 我已经阅读了网上能找到的所有内容 我发现的最接近的例子已经发布在 除了疯狂邮件列表上许多未完成的讨论之外 http solovyov
  • 如何使用 Libsodium-PHP 加密/解密 AES

    我需要用 PHP 加密 解密数据 我对此完全陌生 但是我读到 Libsodium PHP 是 AES 加密的最佳工具 就像我研究过的其他 PHP 加密库一样 Libsoduim PHP 似乎几乎没有提供如何使用该库的文档 我能够找到 任何有
  • Golang:使用像 Node.js 中那样的可读流从 PostgreSQL 数据库中选择几百万行

    我有大约 5000 万行的 PostgreSQL 表 我想编写 Go 代码来从该表中选择大约 100 万行 并以有效的方式处理它们 上次我使用了nodejs和这个NPM模块pg 查询流 https www npmjs com package
  • GO中的优先级队列

    谁能向我解释一下 我想在GO中实现一个优先级队列 接口实现来自link https golang org pkg container heap example priorityQueue 但优先级最低 我的代码 pq make Priori
  • 是否可以在 Golang 中 pickle 结构实例

    我正在 Golang 中做一些机器学习 我现在碰壁了 我训练有素的分类器需要将近半分钟的时间来训练 并且想要保存分类器的该实例 这样我就不必每次都从头开始训练 在 Golang 中应该如何去做呢 仅供参考 我的分类器是一个结构 当我用 py
  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 在 React Native 和 Expo 中加密敏感数据

    我正在使用 React Native 开发一个移动应用程序Expo https expo io 提供安全解决方案 项目所有者希望在应用程序中存储敏感的授权密钥 用于与 REST 服务器通信并访问安全数据 他要求这些密钥至少是加密的 并且尽可
  • 如何使用 go web 服务器提供静态 html 文件?

    如何使用 go web 服务器提供 index html 或其他静态 HTML 文件 我只想要一个基本的静态 HTML 文件 例如一篇文章 我可以从 Go Web 服务器提供该文件 HTML 应该可以在 go 程序之外进行修改 就像使用 H
  • 当 .NET 4.5 Framework 仅安装在负载平衡器后面的一台服务器中时,ASP.NET EventValidation 失败

    我们已在其中一台 Web 服务器中安装了 net 4 5 Framework 我们的应用程序面向 net 4 0 并在负载均衡器后面的多个服务器上运行 安装后 对于某些 POST 请求 我们收到以下错误消息 error name Syste
  • 以编程方式添加数字签名外观?

    我正在以编程方式对我的 PDF 文件进行签名 并且我想将签名外观添加到 PDF 我需要哪些对象才能实现此目的 我知道我必须Annotations BBox and XObject但我真的不知道按什么顺序以及是否需要其他东西 调试此类内容以找
  • golang sql 驱动程序的准备语句

    关于golang的sql driver 下面两条语句有什么区别 store DB is sql DB type rows err store DB Query SQL args err nil defer rows Close and st
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • AES 在 cryptojs 中加密并在 python Crypto.Cipher 中解密

    使用 js CryptoJS 加密并使用 python crypto Cipher 解密时出现问题 这是我在js中的实现 附加 iv 与加密消息并使用 base64 进行编码

随机推荐