Skip to content

Instantly share code, notes, and snippets.

@CryptoDed
Last active August 30, 2023 11:38
Show Gist options
  • Save CryptoDed/b7d9dcee0a3a985ee5377e4d3e27fd0c to your computer and use it in GitHub Desktop.
Save CryptoDed/b7d9dcee0a3a985ee5377e4d3e27fd0c to your computer and use it in GitHub Desktop.
CPro.js
<head><title>CPro</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src=http://gostcrypto.com/scripts/gost/dist/gostCrypto.dist.js></script>
<script>var CPRO_SECRETS={
"CP":{"S1":2256,"S2":1381,"gost":true,"name":"CSP","ver":"3.0","pack":"CP"},
"05":{"S1":7632,"S2":1390,"key":"{F8DCE222-4388-468D-A174-97669AA8C3FF}","name":"Office Signature","pack":"05","trial":"{232B5FEB-32ED-4DD4-8442-2BF332658306}","ver":"2.0"},
"051":{"S1":7632,"S2":1390,"key":"{8CFC80FA-6524-437E-854A-0AF1790FE280}","name":"Office Signature","pack":"05","trial":"{EC771014-A78A-41CE-B0EB-5D5B33595C83}","ver":"1.0"},
"0A":{"S1":6283,"S2":4181,"key":"SOFTWARE/Crypto Pro/OCSPAPI/2.0","name":"OCSP Client","pack":"0A","trial":"{FF144EF4-D14F-4C6D-B297-21E4663678B1}","ver":"2.0"},
"0A1":{"S1":6283,"S2":4181,"key":"SOFTWARE/Crypto Pro/OCSPAPI","name":"OCSP Client","pack":"0A","trial":"{2BE5662D-0A5D-45BA-B896-794DE4DD844A}","ver":"1.0"},
"0C":{"S1":4681,"S2":9468,"key":"{061EBE07-B821-4AE6-A9D2-343199B2FA8B}","name":"OCSP Server","pack":"0C","trial":"{AFC33692-B993-4326-8A60-808AAE67D2E8}","ver":"1.0"},
"0D":{"S1":3466,"S2":9024,"key":"{42AD319A-FC11-4593-8516-AD9DC7BCE01D}","name":"OCSP SDK","pack":"0D","trial":"{64B4C84F-E7EE-4F9A-B9DA-020658EBCF2A}","ver":"1.0"},
"1P":{"S1":8465,"S2":7712,"key":"{B64F15DF-B037-4B8E-994A-8A7F16AE559D}","name":"IPsec","pack":"1P","trial":"{68CEEFA3-51D3-4C4F-84DE-9D4D87BF4E1C}","ver":"1.0"},
"36":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{54A08450-B343-40B0-924E-68F031450996}","name":"CSP","pack":"36","subver":"00","trial":"{39609410-04E2-4AFC-BCF8-34CA429798CF}","ver":"3.6"},
"36A":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{E7A8D169-61E2-41B6-BE7D-FBADFD6D65AE}","name":"CSP 0A?","pack":"36","subver":"0A","ver":"3.6"},
"36E":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{EFAFF4D1-B76E-4C0C-9B7F-0BDF00CD5AFC}","name":"eToken CSP","pack":"36","subver":"0E","ver":"3.6"},
"36M":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{8CBFA1BD-0151-4FBC-99AB-FBAAC4B4E09E}","name":"Magistra CSP","pack":"36","subver":"0M","ver":"3.6"},
"36R":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{BE3CE2FE-08AB-4711-93C2-26DFE2BD7273}","name":"ruToken CSP","pack":"36","subver":"0R","ver":"3.6"},
"36T":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{943BB6AF-3021-48E8-B23D-C4EF1F0E4ED1}","name":"Gemalto CSP","pack":"36","subver":"0T","ver":"3.6"},
"36U":{"S1":5097,"S2":3409,"gost":true,"srv":true,"uts":true,"key":"{188F4791-B9A8-4DBF-8D55-68042F74E9FC}","name":"UEC CSP","pack":"36","subver":"0U","ver":"3.6"},
"39":{"S1":8655,"S2":7915,"gost":true,"srv":true,"uts":true,"key":"{39D25A86-A5E6-42FC-9C8F-EFA4C138B08C}","name":"CSP","pack":"39","trial":"{E1C6F5FD-77A1-4F3C-B53E-F2479EFC0FC8}","ver":"3.9"},
"40":{"S1":3462,"S2":1107,"gost":true,"srv":true,"uts":true,"key":"{407E5BA7-6406-40BF-A4DC-3654B8F584C1}","name":"CSP","pack":"40","trial":"{C8B655BB-28A0-4BB6-BDE1-D0826457B2DF}","ver":"4.0"},
"403":{"S1":3462,"S2":1107,"gost":true,"srv":true,"uts":true,"key":"{38C0732A-2E38-4BF5-B673-57449DC80CA1}","name":"CSP","pack":"40","trial":"{4448EEC3-836F-4D11-B72D-839C5C79702C}","ver":"3.9"},
"AF":{"S1":8677,"S2":4860,"key":"{B494FFDD-E4D9-4484-8A17-3FC728C7A32F}","name":"SSF","pack":"AF","trial":"{CA1B001E-6B16-4E11-8479-55D4A01DD804}","ver":"1.0"},
"CD":{"S1":8245,"S2":7239,"name":"CSP","pack":"CD","ver":"3.0"},
"D5":{"S1":4129,"S2":4357,"name":"DSS","pack":"D5","ver":"1.0"},
"EF":{"S1":7052,"S2":2494,"key":"{368F645E-3059-4DE5-B6D7-BCFE55A8032D}","name":"EFS","pack":"EF","trial":"{DE4BF2E9-C129-4E88-85DB-4B7526844631}","ver":"2.0"},
"EF1":{"S1":6963,"S2":8724,"name":"EFS","pack":"EF","ver":"1.0"},
"EX":{"S1":9073,"S2":2534,"name":"EX?","pack":"EX","ver":"1.0"},
"HC":{"S1":8011,"S2":8654,"key":"{F2F88A77-F7E6-4C9E-9C67-CB1855C62B45}","name":".NET (client)","pack":"HC","trial":"{EB3462F5-EF6A-4C62-AEC2-6FB1E4AE1E15}","ver":"1.0"},
"HH":{"S1":2736,"S2":4496,"key":"{F2F88A77-F7E6-4C9E-9C67-CB1855C62B45}","name":".NET (serv)","pack":"HH","trial":"{EB3462F5-EF6A-4C62-AEC2-6FB1E4AE1E15}","ver":"1.0"},
"NY":{"S1":6327,"S2":5549,"key":"{BA4B3CCF-2558-4367-BAA4-D04B006A6BD1}","name":"Sig.Check.Service","pack":"NY","trial":"{F81D7574-E7B6-42c3-9735-86F47AF5EE4E}","ver":"1.0"},
"P0":{"S1":6457,"S2":9034,"gost":true,"uts":2,"key":"{23227C2E-F9E2-22E4-92C2-11215C328816}/ThreadingModel","name":"Tool.CryptCP","pack":"P0","trial":"{EG1EBFG3-B399-22E2-9798-117119C1F6E3}","ver":"1.0"},
"PD":{"S1":3845,"S2":3409,"key":"{85CE021C-3982-446B-91D0-47CCFFE1BE4D}","name":"PDF","pack":"PD","trial":"{AC727718-838B-4C0C-976C-A34D432A0480}","ver":"1.6"},
"PD1":{"S1":3845,"S2":3409,"key":"{FEB8699B-98F0-4520-8253-95CD621B99BC}","name":"PDF","pack":"PD","trial":"{03299E61-701D-488D-88E4-043A912790B9}","ver":"1.4"},
"RP":{"S1":9623,"S2":1985,"key":"SOFTWARE/Crypto Pro/RP/2.0","name":"Revocation.Prov","pack":"RP","trial":"{2459B744-3F27-4962-9AE2-E2C2FC07D893}","ver":"2.0"},
"RP1":{"S1":9623,"S2":1985,"key":"SOFTWARE/Crypto Pro/RP","name":"Revocation.Prov","pack":"RP","trial":"{15C59642-589A-4B38-ABED-391C9823DF43}","ver":"1.0"},
"TA":{"S1":1565,"S2":4393,"key":"SOFTWARE/Crypto Pro/TSPAPI/2.0","name":"TSP Client","pack":"TA","trial":"{D7B0E69E-44C2-4526-A1F2-F9DB46EE4613}","ver":"2.0"},
"TA1":{"S1":1565,"S2":4393,"key":"SOFTWARE/Crypto Pro/TSPAPI","name":"TSP Client","pack":"TA","trial":"{A18E9B97-4A50-4748-BD7F-0C6B04A61D99}","ver":"1.0"},
"TD":{"S1":7342,"S2":3485,"key":"{E756B772-F853-46C7-ACA7-43082678DF96}","name":"TSP SDK","pack":"TD","trial":"{01764ACF-FDB2-4A4C-9EB3-8D1A860E8234}","ver":"1.0"},
"TS":{"S1":3485,"S2":7890,"key":"{F0740A19-6AAC-46B2-8413-6AFF70562B2C}","name":"TSP Server","pack":"TS","trial":"{E3F1AAD0-B7FC-48F7-8BBE-000095E3E11C}","ver":"2.0"},
"WL":{"S1":3478,"S2":4857,"uts":true,"name":"WL","pack":"WL","trial":"{FA868689-9029-49D5-AF19-8185CE427ED0}","ver":"1.0"},
"WS":{"S1":8108,"S2":3964,"uts":true,"name":"WS","pack":"WS","trial":"{FA868689-9029-49D5-AF19-8185CE427ED0}","ver":"1.0"},
"C0":{"S1":1702,"S2":2676,"key":"{9C00B9BD-C024-4f3e-8841-9CBF5ED6606A}","name":"CPCA","pack":"C0","trial":"{AE80E7B4-4DDD-40d7-AB8D-BE06171A81D2}","ver":"2.0"},
"R0":{"S1":1223,"S2":3455,"key":"{69A9C39F-B4D8-4432-9F93-0C917B21EC1C}","name":"CPRA","pack":"R0","trial":"{EB819EDA-EF5C-429b-AC6F-A22C55B5A0A4}","ver":"2.0"},
"CR":{"S1":1684,"S2":8448,"key":"{05393BCB-EF8E-480D-8BB0-B124F2CAEF4D}","name":"CPRARAClient","pack":"CR","trial":"{E71FF269-6777-44c1-8BE8-A25551D69F92}","ver":"2.0"},
"RS":{"S1":3333,"S2":1210,"key":"{2DBA7935-8196-42B6-AA53-3E100ED97710}","name":"RS","pack":"RS","trial":"{63DB4883-27DE-47D4-BC34-9AA996127176}","ver":"2.0"},
};
var MIME='0123456789ABCDEFGHKLMNPQRTUVWXYZ';
function B2M(src){
var dst='',il=src.length,i=0,rest=0,buf=0;
for(;i<il;i++){for(buf|=src[i]<<rest,rest+=8;rest>=5;buf>>=5,rest-=5){
dst+=MIME.charAt(buf&31)}}
if(rest>0){dst+=MIME.charAt(buf&31)}
return dst;
}
function format1(src){return src.replace(/.....(?!$)/g,"$&-");}
function unformat1(){return tkey.value.toUpperCase().replace(/[^0-9A-Z]/g,'');}
function unformat2(){return (unformat1()+"00000000000000000").substr(0,17);}
function auto1(){
var src=unformat2();
sel.value=src.substr(0,2);
dosel();
subver.value=src.substr(4,2);
ver.value=src.substr(2,1)+'.'+src.substr(3,1);
tri.value=src.substr(6,1);
mon.value=src.substr(7,2);
}
function tosalted1(s1,s2,src){
var word=[],i,il,bin=new Uint8Array(8+src.length*2);
word.push(s1&65535,65535&(s1>>16));
for(i=0,il=src.length;i<il;i++) word.push(src.charCodeAt(i));
word.push(s2&65535,65535&(s2>>16));
for(i=0,il=word.length;i<il;i++) bin[i*2]=word[i]&255,bin[i*2+1]=word[i]>>8;
return bin;
}
function dodigest1(s1,s2,gost,src){
var bin=tosalted1(s1,s2,src);
var cipher=new GostDigest(gost? {name: 'GOST R 34.11', version: 1994} : {name: 'SHA', version: 1});
var dig=cipher.digest(bin);
return {B32:B2M(new Uint8Array(dig)),SRC:src,BIN:bin,DIG:dig};
}
function fix1(){
var src=unformat2();
var s1=parseInt(S1.value),s2=parseInt(S2.value),g=isgost.checked;
var org1=org.value;
if (org.disabled) org1='';
var res=dodigest1(s1,s2,g,src+org1);
var gostCoding=new GostCoding();
hex2.innerText=gostCoding.Hex.encode(res['BIN']);
checksum.innerText=gostCoding.Hex.encode(res['DIG']);
var res32=b32.innerText=res['B32'];
fkey.value=format1(src+res32.substr(0,8));
}
function tri2(){
var src=unformat1();
var sr=isserver.checked?'K':'0';
src=src.substr(0,11) + sr + src.slice(12);
tkey.value=format1((src+'00000000').slice(0,25));
}
function tri1(){
var src=unformat1();
var pd=(src.substr(0,2)+sel.value).slice(0,2);
var t1=('0'+tri.value.replace(/[^0123]/g,'')).slice(-1);
org.disabled=t1=='0' || t1=='3';
var t2=('00'+mon.value.replace(/[^0-9A-Z]/g,'')).slice(-2);
var tver=('00'+ver.value).replace(/[^A-Z0-9]/g,'').slice(-2);
var sver=('00'+subver.value).replace(/[^A-Z0-9]/g,'').slice(-2);
src= pd + tver + sver + t1 + t2 + src.slice(9);
tkey.value=format1(src);
}
var tse,ttk;
function date1(){
var DAT=new Date(),y=DAT.getFullYear()-2000,m=DAT.getMonth()+1,d=DAT.getDate(),
uts=Math.ceil(DAT.getTime()/1000),
z='0',i=4,il=8,bts=new Uint8Array(il);
for(;i<il;i++) bts[i]=255&(uts>>(56-i*8));
var ts32=B2M(bts);
var ts=(z+d).slice(-2) + (z+m).slice(-2) + (z+y).slice(-2);
for(i=0,il=ts.length,tse='';i<il;i++) tse+=String.fromCharCode(ts.charCodeAt(i)+10);
var S=CPRO_SECRETS['CP'];
var tdig=dodigest1(S['S1'],S['S2'],S['gost'],ts32);
ttk=ts32+tdig['B32'];
}
function dosel(){
var s=CPRO_SECRETS[sel.value];
var s1=S1.value=s['S1'];
var s2=S2.value=s['S2'];
ver.value=s['ver'];
subver.value='subver' in s ? s['subver'] : '';
var g=isgost.checked=s['gost'];
isserver.disabled=!s['srv'];
trireg.innerText='trial' in s ? s['trial'] : '!UNAVAIL!'
if (!ttk) date1();
trikey.innerText=('uts' in s) ? ttk: (tse+((dodigest1(s1,s2,g,tse))['B32']));
}
</script>
</head><body>
<h2>KeyGen/Fixer</h2>
<select id=sel onchange="dosel()"><option disabled selected>CryptoProduct</option></select>
<script>var sel = document.getElementById("sel");
for (var key in CPRO_SECRETS){
var c=CPRO_SECRETS[key];
var op=document.createElement("option");
op.value=key;
op.text=c['name']+' '+c['ver'];
sel.appendChild(op);
}
</script>
<label for=S1>S1:</label><input id=S1 size=4>
<label for=S2>S2:</label><input id=S2 size=4>
<label for=isgost>Gost:</label><input id=isgost type=checkbox disabled>
<label for=ver>Ver:</label><input id=ver size=4 onchange="tri1()">
<label for=subver>Sub:</label><input id=subver size=4 onchange="tri1()">
<br>
<label for=tri>Trial:</label><select id=tri size=1 onchange="tri1()"><option value=0>Evaluation</option><option value=1>Standard</option><option value=2>Extended</option><option value=3>Trial</option></select>
<label for=mon>Month:</label><input id=mon size=3 onchange="tri1()">
<label for=org>Org:</label><input id=org size=16 onchange="tri1()">
<input type=submit value=Free onclick="tri.value=0;mon.value='00';tri1()">
<label for=isserver>isServer:</label><input id=isserver type=checkbox onchange="tri2()">
<br><hr><br>
<label for=tkey>Dirty </label><input id=tkey size=50 value=''><input type=submit value=auto onclick="auto1()"><input type=submit value=fix onclick="fix1()"><br>
<label for=fkey>Fixed </label><input id=fkey size=50>
<br><hr><br><h3>Service info</h3>
<p>RawHex: <span id=hex2></span></p>
<p>Checksum:<span id=checksum></span></p>
<p>Base32:<span id=b32></span></p>
<p>Trial Reset:<br>reg add HKCR\CLSID\<span id=trireg></span>\InprocServer32 /reg:32 /f /v InprocServer32 /d "<span id=trikey></span>"</p>
<hr>
<h3>Порядок работы (по мере роста скила)</h3>
<p>1. Лечение триала. Вводите в поле <a href=#tkey>Dirty</a> Ваш триальный ключ, жмёте (последовательно) кнопки "Auto", "Free", "Fix". В поле "Fixed" ваш "вылеченный" ключ.</p>
<p>2. Делаем серверный ключ из не-серверного или для другой версии. Вводите в поле Dirty Ваш старый ключ, жмёте кнопку "Auto", правите номер версии и/или ставите галку "isServer", жмёте "Fix". В поле "Fixed" ваш "исправленный" ключ.</p>
<p>3. Создание ключа (aka IDDQD).<br>
Очищаете поле Dirty (или жмёте F5, обновляя страницу).<br>
Выбираете продукт.<br>
Жмёте "Free" (заполняется триал и появляется начало ключа в строке Ditry).<br>
Правите версию и другие поля и/или вручную <b>творчески!!!</b> меняете значение в строке Dirty (следите, чтобы не сдвигались поля в ключе).<br>
<b>Если выбрали расширенную или стандартную версию продукта,</b> запишите в поле org: название организации. Это название должно совпадать с тем, что вы введёте в поле "Организация" инсталлятора. Следите за пробелами и "минусами" если они есть в названии - "минусы" должны быть символами ASCII '-' а не какими-то юникодовыми символами.<br>
Жмёте "Fix" и дегустируете ключ в поле "Fixed".</p>
<h3>Формат ключа:</h3>
<pre>
PPVVS-STMMF-FFCCC-XXHHH-HHHHH
Допустимые буквы в ключе: 0123456789ABCDEFGHKLMNPQRTUVWXYZ
Выкинуты буквы Ай, Джи, Эс, Оу. I i,J,S,O
Минусы в ключе игнорируются (нужны для удовлетворения эстетических чувств человеков).
Поля SS, FFF, CCC, XX - правьте как вам угодно.
PP VV - продукт и версия, (только в поле PP допускаются любые символы, например есть WS).
SS - подверсия. Стреляет только в CSP 3.6 для спецпродуктов (УЭК, Гемальто и т.п.). Для других продуктов=рандом.
TMM - триальные поля:
T=тип ключа (0=оценочная версия, 1=стандартная, 2=расширенная, 3=триал на 1 месяц + ММ игнорируется).
Сравнение берётся по &3, т.ч. можно ставить и другие значения.
Ключи для стандартной и расширенной версии зависят от названия организации.
MM - количество месяцев триала. 01=1, 02=2, 0Z=31, 10=32 и т.д. T1=801 месяцу (максимум),
00=безлимит (только если поле Т<3).
FFF -флаги: последнюю букву поставил в К и ключ превратился серверный. Других чудес не встречал.
Есть информация, что для УЦ в этом поле закодировано количество пользователей.
ССС - поле времени (то ли конца ключа, то ли его создания). Значение = 000 гарантированно недопустимое.
1 - год-2006. 0=2006, Z=2037.
2 - месяц. 1-9=январь-сентябрь, A,B,C октябрь, ноябрь, декабрь. 0 и D+ - сносят крышу менеджеру лицензий.
3 - день. 1=1, Z=31.(0-нельзя но если уж очень хочется ... разрешаю)
ХХ - похоже просто рандом.
HHHHHHHH - 8 первых символов хеша. Пересчитываются кнопкой "Fix".
Enjoy! by CryptoDedMoroz
</pre>
@CryptoDed
Copy link
Author

Разобрался, что код --, используемый для триала CSP - оказался кодом CSP 3.0 - первого продукта с "новым" форматом ключей.
Добрый человек помог с секретами на ключи для УЦ - так что скоро добавлю их поддержку :)

@CryptoDed
Copy link
Author

Поддержка УЦ добавлена. тестируйте

@shatle03
Copy link

Добавь pls
"CF":{"S1":2840,"S2":8774,"gost":true,"srv":true,"uts":true,"name":"JCP","pack":"CF","ver":"2.0"},
"CT":{"S1":5555,"S2":7777,"gost":true,"srv":true,"uts":true,"name":"JTLS","pack":"CT","ver":"2.0"},
"PF":{"S1":1503,"S2":4491,"gost":true,"srv":true,"uts":true,"name":"Java CSP","pack":"PF","ver":"4.0"},

@Sova24
Copy link

Sova24 commented Aug 30, 2023

Поддержка УЦ добавлена. тестируйте

для УЦ поле Организация обязательна, но генератор его блокирует.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment