标签: elliptic-curve

SSLHandshakeException:Android N/7.0上的握手失败

我工作的一个应用程序为其(功率)的用户必须建立自己的服务器(即Nginx的)运行的后台程序.需要在应用程序中配置相应的域才能连接.我一直在测试我自己的手机(索尼z3c)并开始开发5.1.后来我收到了6.0的更新,但仍在模拟器中维护了一个工作5.1.不久前,我开始研究带有7.0图像的AVD,我很惊讶它不会连接到我的服务器,告诉我ssl握手失败了.我的nginx配置非常严格,但它适用于5.1和6.0,所以......?!

这就是我所知道的:

  • 我使用v24作为支持库,即我的compileSdkVersion是24.
  • 我使用Volley v1.0.0.
  • 我已经尝试过TLSSocketFactory,但它没有改变任何东西.这似乎大部分时间都用于阻止SSL3用于较旧的SDK版本.
  • 我已经尝试增加超时,但它没有改变任何东西.
  • 我已经尝试过直接使用HttpURLConnection,但它不会改变堆栈跟踪之外的任何东西(它没有凌空引用,但是完全不同).

如果没有TLSSocketFactory,则通过裸实请求队列进行请求,实例化为Volley.newRequestQueue(context).

这是我在android studio中看到的:

W/System.err: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: Connection closed by peer
W/System.err:     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151)
W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)
W/System.err: Caused by: javax.net.ssl.SSLHandshakeException: Connection closed by peer
W/System.err:     at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
W/System.err:     at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)
W/System.err:     at com.android.okhttp.Connection.connectTls(Connection.java:235)
W/System.err:     at com.android.okhttp.Connection.connectSocket(Connection.java:199)
W/System.err:     at com.android.okhttp.Connection.connect(Connection.java:172)
W/System.err:     at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)
W/System.err:     at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:257)
W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
W/System.err: …
Run Code Online (Sandbox Code Playgroud)

ssl android elliptic-curve sslhandshakeexception android-7.0-nougat

55
推荐指数
5
解决办法
4万
查看次数

如何从比特币签名中获取ECDSA公钥?... SEC1 4.1.6曲线超过(mod p) - 场的关键恢复

更新: Git上提供的部分解决方案

编辑:这个的编译版本可以在https://github.com/makerofthings7/Bitcoin-MessageSignerVerifier上找到

请注意,要验证的邮件必须Bitcoin Signed Message:\n作为前缀. Source1 Source2

在C#实现中有一些错误,我可以从这个Python实现中纠正


实际上提出正确的Base 58地址似乎有问题.

我在下面有以下消息,签名和Base58地址.我打算从签名中提取密钥,散列该密钥,并比较Base58哈希值.

我的问题是:如何从签名中提取密钥?(编辑在这篇文章的底部发现了c ++代码,需要它在Bouncy Castle /或C#中)

信息

StackOverflow test 123
Run Code Online (Sandbox Code Playgroud)

签名

IB7XjSi9TdBbB3dVUK4+Uzqf2Pqk71XkZ5PUsVUN+2gnb3TaZWJwWW2jt0OjhHc4B++yYYRy1Lg2kl+WaiF+Xsc=
Run Code Online (Sandbox Code Playgroud)

Base58比特币地址"哈希"

1Kb76YK9a4mhrif766m321AMocNvzeQxqV
Run Code Online (Sandbox Code Playgroud)

由于Base58比特币地址只是一个哈希,我不能用它来验证比特币消息.但是,可以从签名中提取公钥.

编辑:我强调我是从签名本身派生公钥,而不是从Base58公钥哈希派生.如果我想(并且我确实想要),我应该能够将这些公钥位转换为Base58哈希.这样做我不需要帮助,我只需要帮助提取公钥位并验证签名.

  1. 在上面的签名中,此签名的格式是什么?PKCS10?(答案:不,这是专有的,如此处所述)

  2. 如何在Bouncy Castle中提取公钥?

  3. 验证签名的正确方法是什么?(假设我已经知道如何将公钥位转换为等于上面的比特币哈希的哈希)

之前的研究

此链接描述了如何使用ECDSA曲线,以下代码将允许我将公钥转换为BC对象,但我不确定如何Q从签名中获取点.

在下面的示例中,Q是硬编码值

  Org.BouncyCastle.Asn1.X9.X9ECParameters ecp = Org.BouncyCastle.Asn1.Sec.SecNamedCurves.GetByName("secp256k1");
  ECDomainParameters params = new ECDomainParameters(ecp.Curve, ecp.G, ecp.N, ecp.H);
  ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(
  ecp .curve.decodePoint(Hex.decode("045894609CCECF9A92533F630DE713A958E96C97CCB8F5ABB5A688A238DEED6DC2D9D0C94EBFB7D526BA6A61764175B99CB6011E2047F9F067293F57F5")), // Q
        params);
  PublicKey  pubKey = f.generatePublic(pubKeySpec);


 var signer …
Run Code Online (Sandbox Code Playgroud)

c# python openssl bouncycastle elliptic-curve

24
推荐指数
2
解决办法
8102
查看次数

带有来自商店C#.Net CNG的密钥的ECDSA签名文件

我正在尝试使用CNG API和Microsoft证书库中的证书使用ECDSA签署文件.我已阅读了大量文档,并且已接近完成但我仍然挂断了从证书导入私钥.我用RSA完成了同样的事情,但似乎完全不同.这是我到目前为止的代码:

    static void signFile()
    {
        X509Certificate2 myCert = 
             selectCert(StoreName.My, 
                        StoreLocation.CurrentUser, 
                        "Select a Certificate",
                        "Please select a certificate from the list below:");

        Console.Write("Path for file to sign: ");
        string path = Console.ReadLine();
        TextReader file = null;
        try
        {
            file = new StreamReader(path);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.Write("\nPress any key to return to the main menu: ");
            Console.ReadKey();
        }
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(file.ReadToEnd());
        ECDsaCng dsa = new ECDsaCng(
            CngKey.Import(StringToByteArray(myCert.PrivateKey.ToString()),
                          CngKeyBlobFormat.EccPrivateBlob,
                          CngProvider.MicrosoftSoftwareKeyStorageProvider));

        dsa.HashAlgorithm = CngAlgorithm.Sha384; …
Run Code Online (Sandbox Code Playgroud)

.net c# cryptography elliptic-curve cng

23
推荐指数
3
解决办法
9084
查看次数

使用ECC Curve25519在Java中加密/解密数据

我想在我的Android应用程序中使用Curve25519在本地加密/解密AES加密密钥.我不需要任何密钥交换,密钥协议或签名.为什么我需要使用那条特定的曲线?因为我需要能够自己提供私钥并能够计算它匹配的公钥.所以就我而言,只有Curve25519这样做.如果我错了,请纠正我.

所有Curve25519实现都只进行密钥生成,密钥交换和签名/验证.

在获得Curve25519私钥/公钥后,是否可以进行数据加密/解密,或者您可以建议任何符合我标准的替代曲线?

编辑

那我为什么需要这个呢?我会更仔细地解释一下.我的应用正在进行本地文件加密,尤其是照片.我的目标是让用户无需输入密码即可拍照,然后输入密码进行查看.为此,我需要能够从密码创建公钥/私钥对,并且只要提供相同的密码,就能够在运行时重新创建相同的密钥对.所以在第一次运行时,我从密码生成ECC密钥对,并在设备上存储公钥.当用户想要使用新的照片应用程序使用随机256位AES密钥加密照片,然后使用存储的公钥加密该密钥.当用户想要查看照片时,他/她提供正确的密码,我获得相同的ECC密钥对并使用我的私钥解密AES密钥,然后我可以使用AES 256解密照片.

所以,就我而言,Curve25519可以给我这种能力,或者还有其他选择.欢迎使用Java中的代码示例!

java android cryptography elliptic-curve public-key-encryption

23
推荐指数
1
解决办法
3381
查看次数

iOS中的椭圆曲线加密

我正在尝试将ECC整合到用于安全通信的iPhone应用程序中,但我很难找到关于如何在objective-c中执行此操作的正确库/教程.我读过这篇文章: 如何在iOS中使用ECC 但它是在大约一年前发布的,没有任何回复.任何提示/建议将不胜感激

谢谢!

cryptography objective-c elliptic-curve ios

21
推荐指数
1
解决办法
7036
查看次数

使用OpenSSL ECC加密/解密文本字符串

如何使用OpenSSL的ECC支持来加密或解密文本字符串?我能够使用OpenSSL API生成ECC私钥/公钥,但我不知道如何使用这些密钥加密纯文本.

openssl cryptography elliptic-curve

19
推荐指数
2
解决办法
3万
查看次数

EC公钥是否有标准化的固定长度编码?

我想知道是否有(并且我希望有)ECDH(椭圆曲线Diffie-Hellman)和ECDSA(椭圆曲线数字签名算法)的公钥大小的标准,用于素数场上的每种曲线类型(192,224,256) ,384和521).

cryptography digital-signature elliptic-curve dsa diffie-hellman

17
推荐指数
1
解决办法
1万
查看次数

如何在OpenSSL的EVP_PKEY结构中访问原始ECDH公钥,私钥和参数?

我正在使用OpenSSL的c库生成椭圆曲线Diffie-Hellman(ECDH)密钥对,遵循此处的第一个代码示例.它掩盖了这一行的实际公钥交换:

peerkey = get_peerkey(pkey);
Run Code Online (Sandbox Code Playgroud)

所述pkey变量和返回值的类型都是的EVP *.pkey包含先前生成的公钥,私钥和参数,返回值仅包含对等方的公钥.所以这提出了三个问题:

  1. 如何get_peerkey()实际提取公钥pkey以便发送给对等方?
  2. 代码如何从pKey密钥交换后提取私钥和params 来存储它们以供以后使用?
  3. 如何从对等方的原始公钥get_peerkey()生成新EVP_PKEY结构?

我已经看到了OpenSSL的功能EVP_PKEY_print_public(),EVP_PKEY_print_private()EVP_PKEY_print_params()但这些是用于产生人类可读输出.我还没有找到任何将人类可读的公钥转换回EVP_PKEY结构的等价物.

c openssl pki elliptic-curve diffie-hellman

17
推荐指数
1
解决办法
7020
查看次数

如何使用Java 8从Microsoft密钥库加载下一代证书?

我正在尝试直接从Microsoft商店加载证书,以避免必须从MS商店导出证书,然后将它们导入JKS商店.

我设法使用SunMSCAPI直接从MS商店使用传统加密从典型的AD CS Web服务器模板创建证书.

但是,SunMSCAPI不支持我正在使用的现代CNG密码,特别是RSA-2048非对称加密,SHA-384散列和ECDSA-384数字签名.

是否可以使用Java从MS商店加载下一代证书?我在jdk1.8.0_45.是否有可以处理CNG的现有JCE提供商替代SunMSCAPI?我怀疑它必须使用JNI或JNA来访问本机Windows CNG API.

我试过Pheox JCAPI但没有成功.它支持RSA和DSA,但不支持ECDSA.我没有尝试过Bouncy Castle,但我的理解是它没有提供这样的能力.

还有其他现成的JCE提供商替代SunMSCAPI可以处理CNG我可以尝试吗?

更新:JCAPI v2仅支持明年针对v3计划的RSA,ECDH支持.

更新:有人建议为Java 8安装Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files也许可以解决这个问题,但是没有,这没有帮助,因为问题是SunMSCAPI仅支持RSA密码,可以看出看源代码.

java ssl cryptography cryptoapi elliptic-curve

17
推荐指数
1
解决办法
1062
查看次数

RDSA实施圣人

首先,我必须说我使用Sage数学的知识非常有限,但我真的想改进一个能够解决我遇到的这些问题.我被要求实施以下内容:

1 - 阅读FIPS 186-4(http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf)ECDSA的定义,并使用Sage数学实现:

  (a) prime eliptic curves (P-xxx)

  (b) binary eliptic curves (B-xxx)
Run Code Online (Sandbox Code Playgroud)

我尝试通过浏览互联网来解决(a)并最终得到以下代码:

练习1,a)

class ECDSA_a:

def __init__(self):
    #Parameters for Curve p-256 as stated on FIPS 186-4 D1.2.3
    p256 = 115792089210356248762697446949407573530086143415290314195533631308867097853951
    a256 = p256 - 3
    b256 = ZZ("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)
    ## base point values
    gx = ZZ("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16)
    gy = ZZ("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16)

    self.F = GF(p256)
    self.C = EllipticCurve ([self.F(a256), self.F(b256)])
    self.G = self.C(self.F(gx), self.F(gy))

    self.N = FiniteField (self.C.order()) # how many points are …
Run Code Online (Sandbox Code Playgroud)

python cryptography elliptic-curve sage ecdsa

16
推荐指数
1
解决办法
263
查看次数