我工作的一个应用程序为其(功率)的用户必须建立自己的服务器(即Nginx的)运行的后台程序.需要在应用程序中配置相应的域才能连接.我一直在测试我自己的手机(索尼z3c)并开始开发5.1.后来我收到了6.0的更新,但仍在模拟器中维护了一个工作5.1.不久前,我开始研究带有7.0图像的AVD,我很惊讶它不会连接到我的服务器,告诉我ssl握手失败了.我的nginx配置非常严格,但它适用于5.1和6.0,所以......?!
这就是我所知道的:
如果没有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
更新: 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哈希.这样做我不需要帮助,我只需要帮助提取公钥位并验证签名.
题
在上面的签名中,此签名的格式是什么?PKCS10?(答案:不,这是专有的,如此处所述)
如何在Bouncy Castle中提取公钥?
验证签名的正确方法是什么?(假设我已经知道如何将公钥位转换为等于上面的比特币哈希的哈希)
之前的研究
此链接描述了如何使用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) 我正在尝试使用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) 我想在我的Android应用程序中使用Curve25519在本地加密/解密AES加密密钥.我不需要任何密钥交换,密钥协议或签名.为什么我需要使用那条特定的曲线?因为我需要能够自己提供私钥并能够计算它匹配的公钥.所以就我而言,只有Curve25519这样做.如果我错了,请纠正我.
所有Curve25519实现都只进行密钥生成,密钥交换和签名/验证.
在获得Curve25519私钥/公钥后,是否可以进行数据加密/解密,或者您可以建议任何符合我标准的替代曲线?
编辑
那我为什么需要这个呢?我会更仔细地解释一下.我的应用正在进行本地文件加密,尤其是照片.我的目标是让用户无需输入密码即可拍照,然后输入密码进行查看.为此,我需要能够从密码创建公钥/私钥对,并且只要提供相同的密码,就能够在运行时重新创建相同的密钥对.所以在第一次运行时,我从密码生成ECC密钥对,并在设备上存储公钥.当用户想要使用新的照片应用程序使用随机256位AES密钥加密照片,然后使用存储的公钥加密该密钥.当用户想要查看照片时,他/她提供正确的密码,我获得相同的ECC密钥对并使用我的私钥解密AES密钥,然后我可以使用AES 256解密照片.
所以,就我而言,Curve25519可以给我这种能力,或者还有其他选择.欢迎使用Java中的代码示例!
java android cryptography elliptic-curve public-key-encryption
我正在尝试将ECC整合到用于安全通信的iPhone应用程序中,但我很难找到关于如何在objective-c中执行此操作的正确库/教程.我读过这篇文章: 如何在iOS中使用ECC 但它是在大约一年前发布的,没有任何回复.任何提示/建议将不胜感激
谢谢!
如何使用OpenSSL的ECC支持来加密或解密文本字符串?我能够使用OpenSSL API生成ECC私钥/公钥,但我不知道如何使用这些密钥加密纯文本.
我想知道是否有(并且我希望有)ECDH(椭圆曲线Diffie-Hellman)和ECDSA(椭圆曲线数字签名算法)的公钥大小的标准,用于素数场上的每种曲线类型(192,224,256) ,384和521).
cryptography digital-signature elliptic-curve dsa diffie-hellman
我正在使用OpenSSL的c库生成椭圆曲线Diffie-Hellman(ECDH)密钥对,遵循此处的第一个代码示例.它掩盖了这一行的实际公钥交换:
peerkey = get_peerkey(pkey);
Run Code Online (Sandbox Code Playgroud)
所述pkey
变量和返回值的类型都是的EVP *
.pkey
包含先前生成的公钥,私钥和参数,返回值仅包含对等方的公钥.所以这提出了三个问题:
get_peerkey()
实际提取公钥pkey
以便发送给对等方?pKey
密钥交换后提取私钥和params 来存储它们以供以后使用?get_peerkey()
生成新EVP_PKEY
结构?我已经看到了OpenSSL的功能EVP_PKEY_print_public()
,EVP_PKEY_print_private()
和EVP_PKEY_print_params()
但这些是用于产生人类可读输出.我还没有找到任何将人类可读的公钥转换回EVP_PKEY
结构的等价物.
我正在尝试直接从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密码,可以看出看源代码.
首先,我必须说我使用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)并最终得到以下代码:
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) elliptic-curve ×10
cryptography ×7
openssl ×3
android ×2
c# ×2
java ×2
python ×2
ssl ×2
.net ×1
bouncycastle ×1
c ×1
cng ×1
cryptoapi ×1
dsa ×1
ecdsa ×1
ios ×1
objective-c ×1
pki ×1
sage ×1