Флаттер PGP Шифрование - PullRequest
       87

Флаттер PGP Шифрование

0 голосов
/ 20 февраля 2020

Я изо всех сил пытаюсь заставить шифрование PGP работать над проектом флаттера. Мой подход заключался в использовании шифрования пакета флаттера: ^ 4.0.0 (https://pub.dev/packages/encrypt)

Чтобы прочитать ключи, на которых я пробовал подход: https://gist.github.com/proteye/982d9991922276ccfb011dfc55443d74 который мне пришлось немного изменить, чтобы прочитать мои ключи

Тестовые ключи, которые я использую

const PRIVATE_KEY = '''-----BEGIN PGP PRIVATE KEY BLOCK-----

lQIGBF5L/tUBBAC9DtzYid35N5jPhFOyvRWL7t+jEsa/8ElXtc+IoU8rqgmd8ToD
7Qd3uIzDwnziPg3Z/rvUs/hOtOYJ4Gy3ZXvl+mAMnHOLIR4blc3phlwK1M9fXF10
nHPeB9beJETa1oNl8xn/SWAiUO1S65zK/COEEU0MedR8KbYWeEwxGZEirQARAQAB
/gcDAvBymPZInHER/+kGkKyP0qvjBmc7w1yjU5Fzu4DnlCLCaugKoga9ZsjsRGtR
mnb4rlxCPCfMyeHyspoob+ibaOESz22uJLrOM7UhLwI8ymgkqtNNMem34UlE1oO1
MJsxw/jaMvovVwSQ6CgSCBgSNxw+BHLyHjAGxGfC2karNG20op/QYQbYkqciJuXe
TwRMn6t1A0Qs6zbq0f174GcsVQv9dFkGAvSFoJxuBm9OW3rbTSyiQTtB1nIXjjL2
xW4ip16O/S2J3/7YgtY3QINN2Jolor9EmdU2GOuEhR4pzGvvFB9Q5TeVSHzHZncJ
pQ4aklj3jCfPxHG6ifnaMXPHy24qXAhKd/H2utT+o8VyXnAsH+4a3v9AfWfptUpL
XJ7gZiLdAeAKOIBLJXSnSUlS/wCjbTHKnX3Lcsz8jMpTUithYaejTy8hQ7Z79/AB
JrgSVcyksvr4He9xJVXxsYYlh9BcvXbNrP7QH9c29PafefHWFKAANmG0JVJSQSBU
ZXN0IEtleSAoVGVzdGluZykgPHRlc3RAcnJhLmxhbj6IzgQTAQoAOBYhBLtTlv2h
QxNsn84dLoqUFqxDJMbrBQJeS/7VAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
AAoJEIqUFqxDJMbrju4D/1GKXt3zcmKIVQYZTwwN/v1AqpDRreMFQCF4E5JyCpoO
0yxdjlagKf1y+/1JVGaF2wHQXaTB5cy7Rrd+GIdTKgNP2/bFF3SiK7S5nFPkl6Lt
yYizy3Qtqy1vwa7scB2UJFIdFV04ulRAoG+qhtVbat2J2IA4uwfLA62KDHXJQoZR
nQIFBF5L/tUBBADL3QADFxcZz/ixTXFUdrG+mziiJUt8QxHNCYOEqKgO1HUEzC0y
RFHelR+LPup6MCsBvfxyNHveUZrEa2c/JBpu4FnYqt/6RIPFAhuBzwrYmhCMuOJD
BQmzk/FBiZCswtWqvGxG01HGHhL7+ZEa5/fGejSSy/1NdnGd5YKt7QguaQARAQAB
/gcDAkx/d82tD0aA/wTAxBYpoTlY6LwbOy9rLsV8khT379shwUH5alCOFt8SApl2
xuJBIC3MWoPJmx4b4VlQEMIYJzmW/r1kK3IyxQtlv0lk+MFIg3k2eCbNQ1rRxF1R
zkhaacxw6QuigAT110hIVjV+9gGLMr5S1wwCK0pOqxl20Q/C9/tc1WrAK6eT1GQK
tkam1IFjICs/WLQb+OOfDnde8IXU80x/rUmfcsThVoODaS3cZKMt8ojc34+yq2Tt
nmeXwYRdPDGFAmLhZrw114Cjz1Kn83B+d6ivccWKq9WvR05yOn+394NtBIrfXVLo
YiD7uJb9+kJ80LcbK8/fv+gWMfk5B2hOxT5GoUJwxTL4EfY+Ub+G9gmoDJtgIlS/
hMO06cGgnc5NJQqbeu/ZSWZpxunoGpRSkE8dLX44bn+KWBJ6zeIpIFT1T5nLk+dr
QUw8D0lVSycou9XtBkX4SH8LTz5ICJPMo1kD04ayhbbBIX3aSJStRIi2BBgBCgAg
FiEEu1OW/aFDE2yfzh0uipQWrEMkxusFAl5L/tUCGwwACgkQipQWrEMkxuv6PwP+
LJrM3vau9IU8pP9W1zuNB7RHGfg9DiW7ZzKVWRpFCoBByKbYYZqflYQ/hKRMBLNA
D67mauzHmuAVDRwrht7jXP3/uLDyw11YG/GbW1COBF0DhYRS54pgLdgbkMz9j138
oMeXWdc9RqXQ0sDwsCK5dseXoXTj8IrJyHjECoH3gRk=
=g3UH
-----END PGP PRIVATE KEY BLOCK-----''';

const PUBLIC_KEY = '''-----BEGIN PGP PUBLIC KEY BLOCK-----

mI0EXkv+1QEEAL0O3NiJ3fk3mM+EU7K9FYvu36MSxr/wSVe1z4ihTyuqCZ3xOgPt
B3e4jMPCfOI+Ddn+u9Sz+E605gngbLdle+X6YAycc4shHhuVzemGXArUz19cXXSc
c94H1t4kRNrWg2XzGf9JYCJQ7VLrnMr8I4QRTQx51HwpthZ4TDEZkSKtABEBAAG0
JVJSQSBUZXN0IEtleSAoVGVzdGluZykgPHRlc3RAcnJhLmxhbj6IzgQTAQoAOBYh
BLtTlv2hQxNsn84dLoqUFqxDJMbrBQJeS/7VAhsDBQsJCAcCBhUKCQgLAgQWAgMB
Ah4BAheAAAoJEIqUFqxDJMbrju4D/1GKXt3zcmKIVQYZTwwN/v1AqpDRreMFQCF4
E5JyCpoO0yxdjlagKf1y+/1JVGaF2wHQXaTB5cy7Rrd+GIdTKgNP2/bFF3SiK7S5
nFPkl6LtyYizy3Qtqy1vwa7scB2UJFIdFV04ulRAoG+qhtVbat2J2IA4uwfLA62K
DHXJQoZRuI0EXkv+1QEEAMvdAAMXFxnP+LFNcVR2sb6bOKIlS3xDEc0Jg4SoqA7U
dQTMLTJEUd6VH4s+6nowKwG9/HI0e95RmsRrZz8kGm7gWdiq3/pEg8UCG4HPCtia
EIy44kMFCbOT8UGJkKzC1aq8bEbTUcYeEvv5kRrn98Z6NJLL/U12cZ3lgq3tCC5p
ABEBAAGItgQYAQoAIBYhBLtTlv2hQxNsn84dLoqUFqxDJMbrBQJeS/7VAhsMAAoJ
EIqUFqxDJMbr+j8D/iyazN72rvSFPKT/Vtc7jQe0Rxn4PQ4lu2cylVkaRQqAQcim
2GGan5WEP4SkTASzQA+u5mrsx5rgFQ0cK4be41z9/7iw8sNdWBvxm1tQjgRdA4WE
UueKYC3YG5DM/Y9d/KDHl1nXPUal0NLA8LAiuXbHl6F04/CKych4xAqB94EZ
=Zi9v
-----END PGP PUBLIC KEY BLOCK-----

Но я не могу заставить работать функцию decodePEM, она ломается при попытке base64. расшифруйте символы '='.

С помощью ключа publi c:

The following FormatException was thrown while handling a gesture:
Invalid character (at character 957)
...COBF0DhYRS54pgLdgbkMz9j138oMeXWdc9RqXQ0sDwsCK5dseXoXTj8IrJyHjECoH3gRk==g3UH

С закрытым ключом:

The following FormatException was thrown while handling a gesture:
Invalid padding character (at character 1965)

...PUal0NLA8LAiuXbHl6F04/CKych4xAqB94EZ=Zi9v

Кому-нибудь удалось получить шифрование PGP работать с дротиком? Спасибо!

Мне удалось преобразовать ключ GnuPG в ключ PEM с помощью python, но я все еще не могу загрузить его для создания флаттера. Используемый мной скрипт:

# requires apt install libgpgme-dev
# requires https://github.com/mitchellrj/python-pgp  pip install pgp

from pgp.packets import constants
from pgp.packets import parsers
from Crypto.PublicKey import RSA
import sys


"""
Converts an GnuPG key to a PEM key
If the input is password protected, the same password will be used to protect 
the PEM output.
"""


def convert(keyid, passphrase, infh, outfh):
    packets = parsers.parse_binary_packet_stream(infh)
    for packet in packets:
        if packet.type == constants.SECRET_KEY_PACKET_TYPE or packet.type == constants.SECRET_SUBKEY_PACKET_TYPE:
            print('found key id', packet.key_id)
            if packet.key_id != keyid:
                continue
            if passphrase is not None:
                print('decrypting key', packet.key_id)
                packet.decrypt(passphrase)
            print('creating PEM')
            rsa = RSA.construct((packet.modulus, packet.exponent, packet.exponent_d, packet.prime_p,
                             packet.prime_q, packet.multiplicative_inverse_u))
            pem = rsa.exportKey('PEM', passphrase, 1)
            outfh.write(pem)
            return
        elif packet.type == constants.PUBLIC_KEY_PACKET_TYPE or packet.type == constants.PUBLIC_SUBKEY_PACKET_TYPE:
            print('found public key id', packet.key_id)
            if packet.key_id != keyid:
                continue
            print('creating PEM')
            rsa = RSA.construct((packet.modulus, packet.exponent))
            pem = rsa.exportKey('PEM')
            outfh.write(pem)
            return
    print('key not found')


def main(argv):
    if len(argv) < 3:
        print('usage: gpg2pem.py keyid input.gpg output.pem [passphrase]')
        return
    with open(argv[1], 'rb') as infh:
        with open(argv[2], 'wb') as outfh:
            passphrase = bytes(argv[3], 'ascii') if len(argv) > 3 else None
            convert(argv[0].upper(), passphrase, infh, outfh)


if __name__ == "__main__":
    main(sys.argv[1:])

Ключ результата:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,4D212AB4C43A1FFD

8Jzz64JwB9JHj0MtTMlL8vJ5yeB7DmtKp2gvVywDhat0s413jT0lLA7oOc7JndRQ
tCZNhBtq0HY7eCP0EiAlA60NDZR6YgQeOCIYGEk5cAlNTaGUqb71YyapnXcneY4H
7VWtPvfxDNmTOR0YEyZ2P0HKS7EWa/RY1mDXEz0RMagEcIOwBLJ4zLm5dk06tpSb
UyONIXeAGRGhyJ7eBUcI/J8SvVDYwpbNwaxKD/SZPWJJbKWuzmY0muQhW1zdsAo2
bD4XlvrsYMFccgLOSxpV1pvREO7x2jq49KdTaf5IIyVsgGLcjfT4VS1yue+GEtvp
LMpIqjSk440XCBU9BMWFPmzlTQfby/Kp5NfuvdzeKpFhKrd40gsH3MMOMKKHHMNn
QaEnzNMGH6LsZeq2qOD+hpDCuyjhQHQYmsCdIVE8zM/wy3iNVDQU1w/4DMDghkJA
x00CTG2FP4pdOVhY86sMfxCcmMTGtd4lPeqODESteFoqB3D6QjdcRhDtfmosZIvm
cYo0h0kQaSAM0l5IoButu/f5iZTze6wg73MGJkIfkypWG1vC6fNReXl40Y1/VIRs
hvkUVDtgF/C0AFN8+oMcey5cqApcf0a1JmkgF2I82A0IxflIbScZ81KsTT3yp/Rf
KMIFrVyhnQJ0O26dOo5/OCBdvINzuLGxppQfYQAVdxJhoxbpGn0Vr7RHD8hiczVo
wr6/hoxDcqJrL+waa36IBa3jNkB7WDoIdBdB4D6VR/oTrshS1R8gfUIu1vp6afy+
3TWaBMbdSpCb9sjza6+pYXoNe12yOXjhVL8W26D5m6WwhB8V03BXhw==
-----END RSA PRIVATE KEY-----

Но теперь я получаю ошибку:

Value not in range: 7731175776247557153

When the exception was thrown, this was the stack: 
#0      _rangeCheck (dart:typed_data-patch/typed_data_patch.dart:4631:5)
#1      _ByteBuffer.asUint8List (dart:typed_data-patch/typed_data_patch.dart:1931:5)
#2      new Uint8List.view (dart:typed_data:847:19)
#3      ASN1Parser.nextObject (package:asn1lib/asn1parser.dart:45:30)
#4      RSAKeyParser._parseSequence (package:encrypt/src/algorithms/rsa.dart:236:23)

Мой код:

import 'package:encrypt/encrypt.dart';

String encrypt() {
    final keyParser = RSAKeyParser();
    final privKey = keyParser.parse("""-----BEGIN RSA PRIVATE KEY-----
8Jzz64JwB9JHj0MtTMlL8vJ5yeB7DmtKp2gvVywDhat0s413jT0lLA7oOc7JndRQ
tCZNhBtq0HY7eCP0EiAlA60NDZR6YgQeOCIYGEk5cAlNTaGUqb71YyapnXcneY4H
7VWtPvfxDNmTOR0YEyZ2P0HKS7EWa/RY1mDXEz0RMagEcIOwBLJ4zLm5dk06tpSb
UyONIXeAGRGhyJ7eBUcI/J8SvVDYwpbNwaxKD/SZPWJJbKWuzmY0muQhW1zdsAo2
bD4XlvrsYMFccgLOSxpV1pvREO7x2jq49KdTaf5IIyVsgGLcjfT4VS1yue+GEtvp
LMpIqjSk440XCBU9BMWFPmzlTQfby/Kp5NfuvdzeKpFhKrd40gsH3MMOMKKHHMNn
QaEnzNMGH6LsZeq2qOD+hpDCuyjhQHQYmsCdIVE8zM/wy3iNVDQU1w/4DMDghkJA
x00CTG2FP4pdOVhY86sMfxCcmMTGtd4lPeqODESteFoqB3D6QjdcRhDtfmosZIvm
cYo0h0kQaSAM0l5IoButu/f5iZTze6wg73MGJkIfkypWG1vC6fNReXl40Y1/VIRs
hvkUVDtgF/C0AFN8+oMcey5cqApcf0a1JmkgF2I82A0IxflIbScZ81KsTT3yp/Rf
KMIFrVyhnQJ0O26dOo5/OCBdvINzuLGxppQfYQAVdxJhoxbpGn0Vr7RHD8hiczVo
wr6/hoxDcqJrL+waa36IBa3jNkB7WDoIdBdB4D6VR/oTrshS1R8gfUIu1vp6afy+
3TWaBMbdSpCb9sjza6+pYXoNe12yOXjhVL8W26D5m6WwhB8V03BXhw==
-----END RSA PRIVATE KEY-----""");

    final plainText = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
    final encrypter = Encrypter(RSA(privateKey: privKey));
    return encrypter.encrypt(plainText).base64;
}
...