Перейти к содержанию

Шифрование и расшифровка

Шифрование

URL https://server_name/crypto/decinit

Request

  • Content-type application/json
  • Body JSON
    • api_key = полученный ключ доступа
    • files = array of
      • file = base64(содержимое файла)
      • fname = имя файла
      • desc = описание
      • md5 = md5(содержимое файла)
    • returl = url возврата после успешной расшифровки
    • crt = base64(сертификат нашего ключа пользователя)
    • k = ид ключа, можно получить из certapi
    • enckey = base64(сертификат вашего ГОСТ ключа шифрования) (можно не подавать, тогда расшифрованный файл не будет зашифрован вашим ключем)

Response

  • Success
    • Content-type text/plain
    • Body TEXT
      • UUID запроса, открывать по ссылке https://server_name/crypto/decrypt/UUID
  • Error
    • Content-type text/plain
    • Body TEXT
      • error:1 неправильный json
      • error:2 нет файла
      • error:3 не удалось расшифровать base64 файла
      • error:4 не совпадает md5 файла (если md5 подан)
      • error:5 нет ни одного файла
      • error:6 enckey не является сертификатом ГОСТ ключа
      • error:7 неправильный ключ апи
      • error:8 нет пользователя с таким crt
      • error:9 запрос не создался (внутренняя ошибка)
      • error:10 файл не сохранился (внутренняя ошибка)

Расшифровка

URL https://server_name/crypto/decrypt/UUID

Request

  • Method GET

Response

    После успешной расшифровки если подан returl будет произведен переход на него, после перехода необходимо сделать запрос по https://sign.me/crypto/decget/UUID

Получение результатов расшифровки

URL https://sign.me/crypto/decget/UUID

Request

  • Method GET

Response

  • Success
  • Content-type application/json
  • Body JSON
    • files = array of
      • link = url для скачивания расшифрованного файла
      • name = имя файла
        все файлы необходимо скачать по link
        если применялся enckey, то файлы будут зашифрованы вашим открытым ключем
        

Пример кода python

    import httplib, urllib, json, base64, webbrowser, os, subprocess

    folder=os.path.dirname(__file__)
    inf=os.path.join(folder,'trollme.jpeg') #файл для зашифровки
    f=os.path.join(folder,'trollme.bin') #зашифрованный файл
    df=os.path.join(folder,'result.bin') #скачанный файл
    f2=os.path.join(folder,'trollme2.jpeg') #расшифрованный файл
    pbf=os.path.join(folder,'pub.pem') #открытый ГОСТ ключ
    prf=os.path.join(folder,'pri.pem') #закрытый ГОСТ ключ
    crf=os.path.join(folder,'crt.crt') #ваш сертификат
    ucrf=os.path.join(folder,'ucrt.crt') #наш сертификат пользователя signme
    puu=os.path.join(folder,'uuid.txt') #UUID

    #Создание запроса:

    with open(crf,'r') as scr:
        crt=base64.b64encode(scr.read())
    with open(ucrf,'r') as uc:
        ucrt=base64.b64encode(uc.read())
    enc='openssl smime -encrypt -gost89 -binary -outform DER -in '+ inf +' -out '+ f +' '+ucrf
    p = subprocess.Popen([enc], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    stdout, stderr = p.communicate()
    if stdout:
        print stdout
    if stderr:
        print stderr
        exit(0)
    with open(f, 'rb') as fil:
        encoded_string = base64.b64encode(fil.read())

    str_to_json={
        'files':[{
            'file':encoded_string,
            'fname':f,
            'desc':'no desc',
        }],
        'key': '1234567890',
        'crt': ucrt,
        'enckey':crt,
    }
    s = json.dumps(str_to_json)
    params_raw = {'decrypt' : s}
    params = urllib.urlencode(params_raw)

    conn = httplib.HTTPSConnection('sandbox.sign.me')
    headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
    conn.request("POST", '/crypto/decinit', params, headers)
    response = conn.getresponse()
    data = response.read()
    conn.close()


    with open(puu,'w') as uuf:
        uuf.write(data)
        link='https://sandbox.sign.me/crypto/decrypt/'+data
        webbrowser.open_new(link)

    Проверка:

    with open(puu,'r') as uuf:
        uu=uuf.read()

    conn = httplib.HTTPSConnection('sandbox.sign.me')
    conn.request("GET", '/crypto/decget/'+uu)
    response = conn.getresponse()
    data = response.read()
    conn.close()

    try:
        jd=json.loads(data)
        if jd.get('error'):
            print jd.get('error')
        else:
            import urllib2
            for f in jd.get('files'):
                if f.get('link'):
                    ret = urllib2.urlopen(link).read()
                    with open(df,'w') as resf:
                        resf.write(ret)
                    dec='openssl smime -decrypt -in '+df+' -inform DER -inkey '+prf+' -out '+f2+' -recip '+crf

                    p = subprocess.Popen([dec], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
                    stdout, stderr = p.communicate()
                    if stdout:
                        print stdout
                    if stderr:
                        print stderr
                        exit(0)
    except:
        print data