Шифрование и расшифровка
Шифрование
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
- UUID запроса, открывать по ссылке
- Content-type
- Error
- Content-type
text/plain - Body
TEXTerror:1неправильный jsonerror:2нет файлаerror:3не удалось расшифровать base64 файлаerror:4не совпадает md5 файла (если md5 подан)error:5нет ни одного файлаerror:6enckey не является сертификатом ГОСТ ключаerror:7неправильный ключ апиerror:8нет пользователя с таким crterror:9запрос не создался (внутренняя ошибка)error:10файл не сохранился (внутренняя ошибка)
- Content-type
Расшифровка
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, то файлы будут зашифрованы вашим открытым ключем
- files = array of
Пример кода 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