- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用双相加算法编写椭圆曲线加密的 C 代码。我面临着我不明白的段错误问题。我希望你们中有人能有一个想法。
#include "lib/include/gmp.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/sha.h>
typedef struct{
mpz_t p;
mpz_t a;
mpz_t b;
mpz_t gx;
mpz_t gy;
} ECC;
static mpz_t *inverse_y1, *inverse_y2, *tx, *ty;
ECC secp256k1;
/*
* Initializes the secp256k1 curve.
*/
void initSECP256K1(){
mpz_set_str(secp256k1.p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16);
mpz_init(secp256k1.a);
mpz_set_str(secp256k1.b, "7", 10);
mpz_set_str(secp256k1.gx, "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16);
mpz_set_str(secp256k1.gy, "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16);
inverse_y1 = malloc(sizeof(mpz_t));
inverse_y2 = malloc(sizeof(mpz_t));
mpz_set_str(*inverse_y1, "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16);
mpz_set_str(*inverse_y2, "b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777", 16);
}
/*
* Calculates the s value for ecc point and doubling.
* s = (y2 - y1) / (x2 - x1) mod p if P != Q
* s = (3 * x1 ^ 2 + a) / (2 * y1) mod p if P = Q
* 5 parameters. First one is mpz_t pointer to save the result.
* The other 4 are of type pointer, representing the coordinates.
*/
void calculate_s(mpz_t *s, mpz_t *x1, mpz_t *y1, mpz_t *x2, mpz_t *y2){
mpz_t *s1 = malloc(sizeof(mpz_t));
mpz_init(*s1);
//Point Addition
if(mpz_cmp(*x1, *x2) != 0 || mpz_cmp(*y1, *y2) != 0){
mpz_sub(*s, *y2, *y1);
mpz_sub(*s1, *x2, *x1);
}else{
//Point doubling
mpz_powm_ui(*s, *x1, 2, secp256k1.p);
mpz_mul_si(*s, *s, 3);
mpz_mul_si(*s1, *y1, 2);
}
mpz_invert(*s1, *s1, secp256k1.p);
mpz_mul(*s, *s, *s1);
mpz_clear(*s1);
}
/*
* ECC - Point add and Point double
* It takes 6 parameters, each of type mpz_t pointer.
* The result is stored in the first two pointers.
* The third and forth pointer represent the first coordinate.
* The last two pointer are the second coordinate.
* It calculates the new coordinates as follows:
* x3 = s ^ 2 - x1 - x2 mod p
* y3 = s * (x1 - x3) - y1 mod p
*/
int ecc_papd(mpz_t *x3, mpz_t *y3, mpz_t *x1, mpz_t *y1, mpz_t *x2, mpz_t *y2){
mpz_t *s = malloc(sizeof(mpz_t));
mpz_init(*s);
//calculates s value
calculate_s(s, x1, y1, x2, y2);
//x3 = s^2 - x1 - x2 mpd p
mpz_powm_ui(*x3, *s, 2, secp256k1.p);
mpz_sub(*x3, *x3, *x1);
mpz_sub(*x3, *x3, *x2);
mpz_mod(*x3, *x3, secp256k1.p);
//y3 = s * (x1 - x3) - y1 mod p
mpz_sub(*y3, *x1, *x3);
mpz_mul(*y3, *y3, *s);
mpz_sub(*y3, *y3, *y1);
mpz_mod(*y3, *y3, secp256k1.p);
mpz_clear(*s);
//check if the result is the infinity point
if(mpz_cmp(*x1, *x2) == 0){
if((mpz_cmp(*y1, *inverse_y1) == 0 && mpz_cmp(*y2, *inverse_y2) == 0) ||
(mpz_cmp(*y2, *inverse_y1) == 0 && mpz_cmp(*y1, *inverse_y2) == 0)){
//printf("INFINITY");
return 1;
}
}
return 0;
}
void ecc_double_add(mpz_t *rx, mpz_t *ry, mpz_t *x, mpz_t *y, mpz_t d){
mpz_t *tx = malloc(sizeof(mpz_t));
mpz_t *ty = malloc(sizeof(mpz_t));
mpz_set(*tx, *x);
mpz_set(*ty, *y);
//returns the amount of bits the number has
//sub 2 because it starts to count from 1 and we remove the msb, too.
int bits = (int) mpz_sizeinbase(d, 2) - 2;
int bit, infinity = 0;
//check if bits is -1, (case d=1). If yes, set the base point as solution
if(bits < 0){
mpz_set(*rx, *x);
mpz_set(*ry, *y);
}
for(; bits >= 0; bits--){
bit = mpz_tstbit(d, bits);
if(infinity == 0){
infinity = ecc_papd(rx, ry, tx, ty, tx, ty);
mpz_set(*tx, *rx);
mpz_set(*ty, *ry);
}
//point addition
if(bit == 1){
if(infinity == 0){
infinity = ecc_papd(rx, ry, tx, ty, x, y);
mpz_set(*tx, *rx);
mpz_set(*ty, *ry);
}else{
mpz_set(*tx, *x);
mpz_set(*ty, *y);
infinity = 0;
}
}
}
free(tx);
free(ty);
}
int main(){
initSECP256K1();
mpz_t *rx = malloc(sizeof(mpz_t));
mpz_t *ry = malloc(sizeof(mpz_t));
//tx = malloc(sizeof(mpz_t));
//ty = malloc(sizeof(mpz_t));
mpz_t d;
mpz_init(*rx);
mpz_init(*ry);
mpz_init(d);
int i = 0;
for(; i < 2; i++){
gmp_printf ("d %Zd\n", d);
ecc_double_add(rx, ry, &secp256k1.gx, &secp256k1.gy, d);
gmp_printf ("R.x %Zx\n", rx);
gmp_printf ("R.y %Zx\n", ry);
printf("\n");
mpz_add_ui(d, d, 1);
}
//mpz_clear(*tx);
//mpz_clear(*ty);
mpz_clear(*rx);
mpz_clear(*ry);
return 0;
}
问题出在 ecc_double_add 函数内,使用 mpz_t *tx 和 mpz_t *ty 变量。当我运行代码时,出现段错误。因此,我在函数外部初始化了变量(在主函数中注释掉)。一旦我这样做了,它就会起作用。我很困惑,不知道为什么会收到段错误。我的 C 语言知识不太好,我正在努力提高。我感谢任何帮助:)
*编辑:我正在使用 GNU MP 库来完成此任务,它位于:https://gmplib.org/
最佳答案
我一直在修补,发现 gmp_printf 函数导致了问题。一旦我将其从 for 循环中删除,代码就可以工作了。我用不带参数的 printf 和 gmp_printf 替换了它,代码开始工作。我不确定为什么 gmp_printf 会出现问题,但我发现了这个: https://gmplib.org/list-archives/gmp-bugs/2011-July/002304.html
我用
替换了 gmp_printfprintf("Result: %s\n", mpz_get_str(NULL, 16, *rx));
这不是一个很好的解决方案,但对于测试来说应该足够了。
关于C ECC 双相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43748136/
我正在尝试找出如何检查安装的内存 (RAM) 是 ECC 还是非 ECC我需要通过使用 WMI 类的 C# 来做到这一点。 你们有什么想法吗? 提前谢谢 最佳答案 您可以查询 WMI Win32_Ph
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
这里是我用 Java 编写的代码,但签名生成和验证的过程给出了不同的结果。 请任何人帮助解决这个问题。我将非常感谢您的支持。 package ecdsa.draft; import java.math
大家好,请原谅我的英语我开发了一个大整数函数 c : #ifndef __BIGINTEGER_H #define __BIGINTEGER_H #include #include #include
我目前正在使用双相加算法编写椭圆曲线加密的 C 代码。我面临着我不明白的段错误问题。我希望你们中有人能有一个想法。 #include "lib/include/gmp.h" #include #in
我正在尝试使用 SECP-256K1(比特币的 ECC 曲线)对某些数据进行 SHA256withECDSA 签名,代码如下。这些代码并不总是能正常工作,有时可能会相当不稳定。 我需要帮助稳定下面的代
我正在阅读 Christoffer Paares 书中关于椭圆曲线密码学的部分(“理解密码学”)。我决定在 python 中实现一个用于椭圆曲线点加法和点加倍的函数。对于我的测试,我使用了书中的示例,
想起来很久没写博客了,刚好今天要写实验报告,随便把之前的也完成吧 1.椭圆曲线概念 椭圆曲线在经过化解后,可以用这条式子表达:E:y²=x³+ax+b 其背后的密码学原理,是基
我有 48 字节 ECC secp192r1 签名,可以在其他环境中工作: byte[] signature = new byte[]{(byte)0x08, (byte)0x33, (byte)0x
您好,我正在尝试解码包含 ECC 公钥的对象 但我去 umarshaling 错误说不能正确解码对象。 我正在尝试执行以下操作: var privateKey *ecdsa.PrivateKey va
最新版本的 Java 不支持 ECC Brainpool 曲线。当我读取包含 EC Curve Brainpool 的 X509Certificate 时,出现异常。 我发现 Java 不支持带有 B
java.security.PublicKey#getEncoded() 返回 key 的 X509 表示,与原始 ECC 值相比,在 ECC 的情况下增加了大量开销。 我希望能够以最紧凑的表示形式(
是否有针对 Java 的 ECC(纠错代码)库(例如 Reed-Solomon)的众所周知的实现,它具有友好的开源许可(非 GPL)? 最佳答案 zxing Apache 许可证(不确定这是否符合您对
大多数可用的桌面(廉价)x86 平台现在仍然不支持 ECC 内存 (Error Checking & Correction)。但内存位翻转错误率仍在增长(not the best SO thread,
我正在尝试使用 iOS 上的 KeyChain 创建 Curve25519 key 。我知道 CryptoKit 的存在,不幸的是,它不适用于 iOS 12。有没有办法在 CryptoKit 之前创建
我们需要将数据从 ECC 表实时提取到 Azure 数据湖。Azure 数据工厂具有与 SAP ECC 系统的连接选项,但不支持实时摄取。 请告诉我 Azure/SAP 中是否有任何可用的 nativ
我想要(或创建)基于椭圆 key 加密的序列 key 。我想做的是将信息编码在序列中,这些信息可以公开验证,但只能由我创建。最初的想法来自http://www.ssware.com/cryptolic
我在我的项目中使用 php OpenSSL。如何使用单个私钥创建多个公钥? 在 RSA 中我们不能做这样的事情。但是 ECC 呢? 最佳答案 根据定义,对于一般椭圆曲线密码系统中的每个私有(priva
我想(或创建)基于椭圆 key 加密的串行 key 。我想做的是在序列中编码信息,这些信息可以公开验证但只能由我创建。最初的想法来自http://www.ssware.com/cryptolicens
我在我的项目中使用 php OpenSSL。如何使用单个私钥创建多个公钥? 在 RSA 中我们不能做这样的事情。但是 ECC 呢? 最佳答案 根据定义,对于一般椭圆曲线密码系统中的每个私有(priva
我是一名优秀的程序员,十分优秀!