我正在尝试使用java BouncyCastle库解密和验证PGP消息,但遇到了问题,抱怨PartialInputStream的过早结束.
我知道加密工作正常,因为我可以在命令行上使用gpg解密和验证使用加密函数创建的消息.
这是代码:
public static void signEncryptMessage(InputStream in, OutputStream out, PGPPublicKey publicKey, PGPPrivateKey secretKey, SecureRandom rand) throws Exception {
out = new ArmoredOutputStream(out);
PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(new BcPGPDataEncryptorBuilder(PGPEncryptedData.AES_256).setWithIntegrityPacket(true).setSecureRandom(rand));
encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey));
OutputStream compressedOut = new PGPCompressedDataGenerator(PGPCompressedData.ZIP).open(encryptedDataGenerator.open(out, 4096), new byte[4096]);
PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(new BcPGPContentSignerBuilder(publicKey.getAlgorithm(), HashAlgorithmTags.SHA512));
signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, secretKey);
signatureGenerator.generateOnePassVersion(true).encode(compressedOut);
OutputStream finalOut = new PGPLiteralDataGenerator().open(compressedOut, PGPLiteralData.BINARY, "", new Date(), new byte[4096]);
byte[] buf = new byte[4096];
int len;
while ((len = in.read(buf)) > 0) {
finalOut.write(buf, 0, len);
signatureGenerator.update(buf, 0, …Run Code Online (Sandbox Code Playgroud) 我想(PGP/GPG)签署python代码.是的,我已经阅读过这个以及许多其他关于保护和混淆 python代码的网站 - 这一切都不是我想要的.我不想混淆代码.我希望客户和用户能够看到代码,他们可以修改代码,复制代码并进行衍生工作,我希望将软件置于GPLv3下.但我想拥有"已签名"的插件,因此在执行过程中它们可能会受到信任.
这在Python中可行吗?检查gpg签名后我可以导入库吗?什么是容易的:检查文件的gpg签名,然后通过导入加载,否则引发异常.但这只适用于单文件导入,而不是目录python模块.
很明显,如果客户在程序中更改了GPG密钥,或者在检查算法中自己删除了一些行,则一切都消失了 - 但这不是问题.他可以做任何他想做的事 - 但这很愚蠢.他想要的是值得信赖.我想让他通过将其复制到"插件"目录中来添加第三方插件,并让程序检查插件的"可信度" - 然后导入它.(所以他可以运行没有签名的插件,但是他有自己的风险.)
我想验证我的程序在我客户的站点上运行创建的文本日志文件是否已被篡改.你怎么建议我这样做?我在这里搜索了一堆谷歌,但找不到我的答案.谢谢!
编辑:看完所有建议到目前为止这里是我的想法.我想保持简单,因为客户不是那种电脑,我认为将盐嵌入二进制文件是安全的.我将继续使用关键字"salt checksum hash"等搜索一个简单的解决方案,并在找到一个后回发到这里.
我目前正在尝试为我的小型电子邮件发送脚本(使用Python 3.x和python-gnupg模块)添加PGP签名支持.
签署消息的代码是:
gpg = gnupg.GPG()
basetext = basemsg.as_string().replace('\n', '\r\n')
signature = str(gpg.sign(basetext, detach=True))
if signature:
signmsg = messageFromSignature(signature)
msg = MIMEMultipart(_subtype="signed", micalg="pgp-sha1",
protocol="application/pgp-signature")
msg.attach(basemsg)
msg.attach(signmsg)
else:
print('Warning: failed to sign the message!')
Run Code Online (Sandbox Code Playgroud)
(这basemsg是email.message.Message类型.)
而messageFromSignature函数为:
def messageFromSignature(signature):
message = Message()
message['Content-Type'] = 'application/pgp-signature; name="signature.asc"'
message['Content-Description'] = 'OpenPGP digital signature'
message.set_payload(signature)
return message
Run Code Online (Sandbox Code Playgroud)
然后我将所有需要的标题添加到消息(msg)并发送它.
这适用于非多部分消息,但在basemsg多部分(multipart/alternative或multipart/mixed)时失败.
手动验证相应文本的签名是否有效,但Evolution和Mutt报告签名是错误的.
任何人都能指出我的错误吗?
我需要在命令行上运行一个命令,要求用户响应.万一它有助于命令是:
gpg --recipient "Some Name" --encrypt ~/some_file.txt
Run Code Online (Sandbox Code Playgroud)
当你运行它时,它警告某事然后问:
无论如何使用这个键?(Y/N)
回答'y'让它正确完成.我一直在尝试使用open4 gem,但我无法正确指定'y'.这是我尝试过的:
Open4::popen4(cmd) do |pid, stdin, stdout, stderr|
stdin.puts "y"
stdin.close
puts "pid : #{ pid }"
puts "stdout : #{ stdout.read.strip }"
puts "stderr : #{ stderr.read.strip }"
end
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我正在做什么甚至可能?
如何在Web应用程序的客户端解密某些加密数据?
例如
可能我可以将私钥传递给浏览器并使用Javascript来解密数据.
我正在尝试使用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)
我不正确地使用包裹吗?关于如何跟踪这个(在我看来)错误输出的原因的任何想法?
从GnuPG 2.1(https://www.gnupg.org/faq/whats-new-in-2.1.html)开始,GnuPG的私钥存储在private-keys-v1.d子目录中。在尝试创建密钥等之后,我发现*.key此目录中有几个文件:
$ ls .gnupg/private-keys-v1.d
xxxxxxxxxxxxxxxxxxxxxxxxxxxx.key
yyyyyyyyyyyyyyyyyyyyyyyyyyyy.key
zzzzzzzzzzzzzzzzzzzzzzzzzzzz.key
...
Run Code Online (Sandbox Code Playgroud)
文件名(x +,y +和z +)看起来像指纹等,但不等于我现有的任何公钥。如何找到此目录中的哪个密钥文件属于哪个可见的密钥gpg --list-keys?
我试图更好地了解 gpg 发生了什么。
如果您有文件并签名: gpg --sign file.txt
您可以通过以下方式进行验证: gpg --verify file.txt.gpg
当您获得成功的输出时: gpg: Signature made...
但是当您签署并加密文件时: gpg --encrypt --sign -r test@email.com file.txt
然后--verify在我得到的加密文件上运行:gpg: verify signatures failed: Unexpected error
我知道我可以调用--decrypt文件,它会验证和解密它,但是如果我只想验证怎么办?
有没有办法将(二进制).key文件转换为ASCII装甲.asc文件?
有一篇文章似乎暗示文件扩展名无关紧要,文件内容是相同的:与PGP相比,b/w .pkr和.key文件的区别是什么?
pgp ×10
gnupg ×6
encryption ×3
python ×2
bouncycastle ×1
c++ ×1
certificate ×1
command-line ×1
email ×1
go ×1
import ×1
java ×1
javascript ×1
openpgp ×1
ruby ×1
sign ×1