我正在测试Synapse并想知道如何建立安全连接.我注意到它支持SSL,但我不确定它是否适合我的需求.我没有CA的证书.我只想加密我的服务器程序和客户端程序之间的所有数据.当然,我可以在发送之前自己加密数据.但是如果SSL可以加密数据,也许我可以使用它.据我所知,SSL用于"加密"和"身份验证".我需要的只是"加密".Synapse有可能吗?
更新:
感谢daemon_x和Synapse的作者Lukas Gebauer的帮助,我想我终于让它发挥了作用.这是我做的:
服务器端:
1)在你的单元中使用ssl_openssl并将'libeay32.dll'和'ssleay32.dll'放到exe文件的同一目录中
2)接受连接后,为新创建的套接字添加以下代码行.
fclient.SSLAcceptConnection;
Run Code Online (Sandbox Code Playgroud)
客户方:
1)在你的单元中使用ssl_openssl并将'libeay32.dll'和'ssleay32.dll'放到exe文件的同一目录中
2)连接到服务器后,添加以下行.
fclient.SSLDoConnect;
Run Code Online (Sandbox Code Playgroud)
如果没有发生错误,则连接现在是安全的.但是当您运行代码时,如Synapse文档中所述,您可能会注意到SSLAcceptConnection需要一些时间才能返回.因此,如果您想加快速度,最好先预先创建证书文件和私钥文件.并在SSLAcceptConnection之前添加以下代码
fclient.SSL.CertificateFile := 'bs-cert';
fclient.SSL.PrivateKeyFile := 'bs-privatekey';
Run Code Online (Sandbox Code Playgroud)
如果您没有证书和私钥,请参阅ssl_openssl中的"CreateSelfSignedCert"以获取自签名证书和私钥.您可以通过WriteStrToStream将FCertificate和FPrivatekey保存到文件中,稍后再使用它们.
我已经生成了一个新的公钥/私钥对并将其导出为XML字符串:
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048);
string publicPrivateKey = RSA.ToXmlString(true);
Run Code Online (Sandbox Code Playgroud)
publicPrivateKey中的XML字符串如下所示(为了便于阅读,缩短了字符串):
<RSAKeyValue>
<Modulus>t6tLd1Wi7PEkwPfx9KGP1Ps/5F2saXnOsCE2U....</Modulus>
<Exponent>AQAB</Exponent>
<P>3LJ5y4Vla7cS3XgmbIH5dQgppUHa+aSWavEOCbDRS/M....</P>
<Q>1QyGIAnjv4YLcRVdwXtxWkijc+aZ496qIBZnCAUUD/E....</Q>
<DP>0821dc0f+LBKOqIEvj4+2kJrNV5ueQesFBYkEsjPFM....</DP>
<DQ>ugSzX2oDJwjdGKG1OOiVcmUWAm6IU4PpOxcUYtY8TC....</DQ>
<InverseQ>LDQIQu+LSB6CSZBrGxNQthWi9mkuPGVZyDDr....</InverseQ>
<D>qZm2bXKH8WwbsJ8ZlT3S1TbgUifppLrqSRkb8XqEcMv....</D>
</RSAKeyValue>
Run Code Online (Sandbox Code Playgroud)
生成的公钥应该在其他应用程序(PHP/JavaScript/JAVA)中用于加密数据.上述XML的哪一部分定义了公钥/我必须将哪些部分发送给其他应用程序的开发人员?
而在另一方面:什么定义私钥/我必须存储哪些部分/部分才能解密由我的公钥加密的数据?
我在php中有一个web服务,它生成一个用于加密消息的密钥对,以及一个用于检索私钥并解密消息的java应用程序.
对于php我正在使用http://phpseclib.sourceforge.net/并拥有这两个文件:
keypair.php
<?php
set_time_limit(0);
if( file_exists('private.key') )
{
echo file_get_contents('private.key');
}
else
{
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->createKey();
$res = $rsa->createKey();
$privateKey = $res['privatekey'];
$publicKey = $res['publickey'];
file_put_contents('public.key', $publicKey);
file_put_contents('private.key', $privateKey);
}
?>
Run Code Online (Sandbox Code Playgroud)
encrypt.php
<?php
include('Crypt/RSA.php');
//header("Content-type: text/plain");
set_time_limit(0);
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_OAEP);
$rsa->loadKey(file_get_contents('public.key')); // public key
$plaintext = 'Hello World!';
$ciphertext = $rsa->encrypt($plaintext);
echo base64_encode($ciphertext);
?>
Run Code Online (Sandbox Code Playgroud)
在java中我有这个代码:
package com.example.app;
import java.io.DataInputStream;
import java.net.URL;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
public class MainClass …Run Code Online (Sandbox Code Playgroud) 我想X509Certificate2从字符串创建.让我举个例子:
string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));
Run Code Online (Sandbox Code Playgroud)
并keyBase64String有这样的内容:"MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="
并且file.PKCS7是我从数据库下载的字节数组.
创建时我遇到以下异常X509Certificate2:
找不到请求的对象
并且堆栈跟踪:
"无法在系统中的System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte [] rawData)处的System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32hr)中找不到请求的对象"X509Certificate2异常"无法找到请求的对象"}. WebApp.SoupController.d__7.MoveNext()上的System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData)中的Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData,Object password,X509KeyStorageFlags keyStorageFlags)在D:\ Projects\WebApp\Controllers\SoupController.cs中:第118行
请告诉我我做错了什么.任何帮助将不胜感激!
我正在研究一个用例,其中使用OpenPGP在智能卡(Yubikey)上生成公钥对。
然后将智能卡运送给用户。尝试在本地模拟此操作,正在执行以下操作:
问题是执行上述步骤后我无法测试加密文件,因为公钥似乎丢失了。 fetch似乎不起作用。
在此阶段,我不想在任何联机服务器上共享公钥。删除密钥环后,有什么方法可以从智能卡中检索公钥?
以下是要执行的步骤:
$ gpg --card-edit
Reader ...........: 1050:0404:X:0
Application ID ...: D2760001240102010006046314290000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 04631429
Name of cardholder: sm sm
Language prefs ...: en
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: sm
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Go的openpgp/armor包以ASCII装甲编码打印PGP公钥.
我期望的输出:
-----BEGIN PGP PUBLIC KEY BLOCK-----
<base64 encoded bytes of public key>
<checksum>
-----END PGP PUBLIC KEY BLOCK-----
Run Code Online (Sandbox Code Playgroud)
我得到的输出:
-----BEGIN PGP PUBLIC KEY BLOCK-----
<first part of base64 encoded bytes of public key>
Run Code Online (Sandbox Code Playgroud)
它只打印公钥的第一部分.
公钥是从本地密钥环文件获取的,并按如下方式处理:
keyRingFileBuffer, err := os.Open(keyRingFilePath)
if err != nil {
log.Fatal(err)
}
defer keyRingFileBuffer.Close()
keyRing,err := openpgp.ReadKeyRing(keyRingFileBuffer)
if err != nil {
log.Fatal(err)
}
for _, k := range keyRing {
w, _ := armor.Encode(os.Stdout, openpgp.PublicKeyType, nil)
k.PrimaryKey.Serialize(w)
}
Run Code Online (Sandbox Code Playgroud)
我不正确地使用包裹吗?关于如何跟踪这个(在我看来)错误输出的原因的任何想法?
我想知道是否存在一些非对称加密算法可以使用两个不同的私钥,这样加密的消息可以被这些私钥中的任何一个解密?
encryption encryption-asymmetric public-key-encryption public-key private-key
我正在使用 openssl 从曲线“secp128r1”生成ECC的密钥对
我遵循的步骤:
首先我使用命令生成了一个私钥
openssl ecparam -genkey -name secp128r1 -noout -out private.pem
然后我使用命令查看了相应的公钥
openssl ec -in private.pem -text -noout
它显示的输出为:
读取 EC 密钥
私钥:(128 位)
priv:
00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
f4:bc
pub:
04:04:ce :24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e :aa:d5:
30:a8:a5
ASN1 OID: secp128r1
我想从这里生成的公钥中明确地得到 x 和 y 组件,请有人建议正确的方法吗?
上面的公钥是 264 位长,因此不能按原样使用(/拆分)
谢谢
我正在开发一个Node应用程序,我已经在其中构建了一个解密器函数,并使用Openpgp.js npm模块来完成这项工作.我接受了用我们的公钥制作的各种提交的PGP客户端文件,当他们进来时使用我们的私钥解密它们,并将解密的版本放在一个文件夹供我访问,所有看起来都很好....因为文件是装甲的.以下是显示事件顺序的代码示例行:
const encryptedData = fs.readFileSync(encryptedFilePath, 'utf8')
openpgp.decrypt({
message: openpgp.message.readArmored(encryptedData),
publicKeys,
privateKey
}).then( (decrypted) => { fs.writeFile(decryptedFilePath, decrypted.data } )
Run Code Online (Sandbox Code Playgroud)
当装甲文件通过时,一切都很顺利,我在指定的文件夹中获取解密文件.在文本编辑器中打开时,这些文件的格式如下:
-----BEGIN PGP MESSAGE-----
WBh2X7KwfEBDx0LEE1FzlnvxZs44o62FclpTazJpcl9J7DjwVfg9cHCID0TAN6Y6
B3b5bCQQFe1wTgpIkVtd0mFGQx7KGHj4FGte53qseVxC2bfq9PGKRIAUg6olr+82
Run Code Online (Sandbox Code Playgroud)
但是,我们有客户端使用装甲选项关闭加密文件,因此在文本编辑器中打开时它们会以十六进制格式出现....
7403 436d e6c0 f941 daac 945b 9a81 f066
6cd2 0032 5df0 9ca2 23a0 6eec a7bb f24c
a941 99a8 1053 ae23 f88b 245c f709 c2b2
Run Code Online (Sandbox Code Playgroud)
.....或编码文本文件,如下所示:
DµÉ‰í+?3K€Ð?˜PªeZ_|Ò®ó0??ãZqRµ3!ŒpuÉW?NZrìÚk´
Aˆ›œiêø8?Ú?ól:äΟ”?6‡)
w?¬ÌŒWÝÚ¢?Q??œ?œ??H¨¿?œ//?ÃBA?´>(%°?e?
Run Code Online (Sandbox Code Playgroud)
(最后两个类似于我在代码示例中控制日志"encryptedData"时所看到的内容.)
每当有任何非装甲文件进入时,该过程都会失败,我最初会遇到几个不同的错误,具体取决于上面显示的类型.我在fs.readFileSync上删除了'utf8'编码,并将"fromBinary"替换为"readArmored"以将数据作为可能有效的二进制思想处理,但随后我收到有关"无效的解密会话密钥"的错误.所以我尝试在主解密之前使用"decryptSessionKey"函数,因为它在文档中显示,这让我得到一个未定义的密钥和一个关于"没有找到对称加密的会话密钥包"的错误.此外,我可能正在咆哮错误的树,因为使用Openpgp.js的二进制文件似乎需要一个密码,我认为这不同于解锁我的私钥的密码,这是我唯一的密码.
我已经搜索了整个Openpgp.js文档和谷歌搜索疯狂,但似乎无法找到一个可靠的程序,如何修改我的代码,适用于ASCII装甲文件解密非装甲文件.(但是,当使用像PGP桌面这样的桌面解密程序时,每个进来的文件都会快速解密并且没有错误,所以我无法弄清楚我的差异在哪里以及为什么解决方案不明显.)任何人都有任何经验有这个或可能的解决方案?
我有一种从.cer文件生成公钥的方法。我将.cer文件内容转换为输入流,一旦获得该流,就调用此方法生成公共密钥
public static void generatePublicKey(InputStream inputStream) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");
Certificate certificate = certificateFactory.generateCertificate(inputStream);
publicKey = certificate.getPublicKey();
inputStream.close();
} catch (CertificateException | IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
它一直有效,直到我们将项目更新为针对Android Pie为止。看起来Google已使用BC提供程序弃用了,这就是造成此问题的原因。如果在getInstance()中使用“ BC”,则会得到NoSuchAlgorithmException。如果我删除“BC”,并通过CertificateFactory.getInstance("X.509")这是由谷歌提出的方法在这里https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
我得到
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0c0000be:ASN.1 encoding routines:OPENSSL_internal:WRONG_TAG
java android ssl-certificate public-key-encryption x509certificate
encryption ×3
c# ×2
cryptography ×2
gnupg ×2
openpgp ×2
rsa ×2
.net ×1
android ×1
bouncycastle ×1
delphi ×1
go ×1
java ×1
node.js ×1
openpgp.js ×1
openssl ×1
pgp ×1
php ×1
phpseclib ×1
private-key ×1
public-key ×1
security ×1
ssl ×1