Ïîäõîä ê ñîçäàíèþ òðóäíîàíàëèçèðóåìûõ øèôðîâ
 äàííîé ñòàòüå ðàññìàòðèâàåòñÿ ïîäõîä ê ñîçäàíèþ êðèïòîàëãîðèòìîâ, ïðåîáðàçóþùèõ èñõîäíûé òåêñò òàêèì îáðàçîì, ÷òîáû òðóäî¸ìêîñòü åãî àíàëèçà áûëà íå íèæå ïîëíîãî ïåðåáîðà âñåãî ìíîæåñòâà êëþ÷åé, à òàêæå íåâîçìîæíî îñìûñëåííàÿ ìîäèôèêàöèÿ çàøèôðîâàííîãî ñîîáùåíèÿ áåç òî÷íîãî çíàíèÿ êëþ÷à.
 îòëè÷èå îò íåêîòîðûõ äðóãèõ ñòàòåé, îïèñûâàþùèõ «äîèñòîðè÷åñêèå» êðèïòîàëãîðèòìû, åäèíñòâåííîå äîñòîèíñòâî êîòîðûõ â òîì, ÷òî èõ èñïîëüçîâàíèå íå íàäî ëèöåíçèðîâàòü ó ñïåöñëóæá, ðàññìàòðèâàåìûé ñèììåòðè÷íûé êðèïòîàëãîðèòì áàçèðóåòñÿ íà ñîâðåìåííîé òåîðèè äâîè÷íûõ ïîëèíîìîâ è îáåñïå÷èâàåò íåâîçìîæíîñòü àíàëèçà øèôðîâàííîãî òåêñòà ñóùåñòâóþùèìè òåõíîëîãèÿìè. Òóò óæå íèêàêîé «õàêåð» íå ñìîæåò âçëîìàòü øèôð íè íà áóìàæêå, íè íà ñâî¸ì ýííîì ïåíòèóìå, à ïðè âûáîðå ñîîòâåòñòâóþùåé äëèíû êëþ÷à, øèôð íåâîçìîæíî áóäåò âçëîìàòü âñåìè âû÷èñëèòåëüíûìè ñðåäñòâàìè ïëàíåòû â ðàçóìíûå ñðîêè. Îïèñûâàåìûé àëãîðèòì ïðîñò è ëåãêî ðåàëèçóåì, ðàáîòàåò äîñòàòî÷íî áûñòðî, ïîñêîëüêó íå èñïîëüçóåò òðóäî¸ìêèõ îïåðàöèé âðîäå óìíîæåíèÿ è äåëåíèÿ, âðåìÿ åãî âûïîëíåíèÿ ëèíåéíî çàâèñèò îò îáú¸ìà òåêñòà è íåñóùåñòâåííî çàâèñèò îò äëèíû êëþ÷à (íî ñóùåñòâåííî çàâèñèò îò âèäà ïîëèíîìà). Àëãîðèòì ëåãêî ðåàëèçóåì àïïàðàòíî.
Äà, ýòî íàäî
À çà÷åì íàäî øèôðîâàòüñÿ âîîáùå? Åñòü ëè ÷òî ñêðûâàòü îáû÷íîìó çàêîíîïîñëóøíîìó ãðàæäàíèíó îò "âñåñèëüíûõ" ñïåöñëóæá (èëè ðàçíûõ ò¸ìíûõ ëè÷íîñòåé)? Ïðåäñòàâëÿåò ëè öåííîñòü äëÿ êîãî-íèáóäü áàíàëüíàÿ ëè÷íàÿ æèçíü îáû÷íûõ ëþäåé?
Äóìàþ ëèøíèé ðàç òðîãàòü õàêåðîâ è êðàêåðîâ íå íàäî, ýòî íàâåðíî âñåì ïîðÿäêîì ïîäíàäîåëî, à âîò âñïîìíèòü íåäàâíèé ñêàíäàë â Åâðîïàðëàìåíòå, ñâÿçàííûé ñ ñèñòåìîé òîòàëüíîãî ýëåêòðîííîãî øïèîíàæà «Ýøåëîí», ñòîèò (ñòàòüÿ â îäíîì èç íîìåðîâ æóðíàëà «Ýõî Ïëàíåòû» çà ýòîò ãîä).  Åâðîïàðëàìåíòå îáñóæäàëñÿ âîïðîñ, î òîì, ÷òî æå âñ¸-òàêè äåëàòü äàëüøå, âåäü íèêòî íå ñîáèðàëñÿ âûêèäûâàòü «Ýøåëîí» íà ñâàëêó òîëüêî èç-çà òîãî, ÷òî Åâðîïàðëàìåíòó ýòî íå ïîíðàâèëîñü! È îäíèì èç âûõîäîâ áûëî ïðèçíàíèå íåîáõîäèìîñòè òîòàëüíîãî èñïîëüçîâàíèÿ êðèïòîñèñòåì.
À íàñ÷¸ò òîãî, èíòåðåñíà ëè æèçíü îáû÷íûõ ëþäåé ñïåöñëóæáàì, ñòîèò âñïîìíèòü ñòàòüþ, ïðîìåëüêíóâøóþ íà ñòðàíèöàõ îäíîé èç êîìïüþòåðíûõ ãàçåò (àâòîðà íå ïîìíþ, èçâèíÿéòå ;).  íåé âûñêàçûâàëîñü ïðåäïîëîæåíèå î òîì ÷òî ëè÷íàÿ ïåðåïèñêà è òîìó ïîäîáíîå çàïîìèíàåòñÿ è õðàíèòñÿ â àðõèâàõ ñïåöñëóæá, è êîãäà ýòîò ÷åëîâåê ñòàíîâèòñÿ ÷åì-òî èíòåðåñåí, àíàëèçèðóåòñÿ âñÿ åãî ëè÷íàÿ æèçíü îò è äî, è ñòàíîâÿòñÿ ïîíÿòíûìè îñîáåííîñòè åãî ïñèõèêè, ïîâåäåíèÿ, âûáîð îïòèìàëüíûõ âîçäåéñòâèé, ÷òîáû âûíóäèòü ÷åëîâåêà ñîâåðøèòü íóæíûé ïîñòóïîê. Íå ñîìíåâàþñü, äîëÿ èñòèíû â òàêîì ïðåäïîëîæåíèè åñòü.
 ëîêàëüíûõ ñåòÿõ ïðîñëóøàòü âåñü òðàôèê ñâîåãî ñåãìåíòà ñìîæåò äàæå íà÷èíàþùèé ëàìåð ;).
Äà, åù¸. Ïðî ñóùåñòâîâàíèå âñÿêèõ ñðåäñòâ ïåðåõâàòà èçëó÷åíèÿ ìîíèòîðîâ è ò.ï. ÷èòàë ìíîãî, à âîò ïðî ðåàëüíîå èõ èñïîëüçîâàíèå äëÿ îòëîâà ïðåñòóïíèêîâ íå ñëûøàë. Âñ¸ ñâîäèëîñü ê áàíàëüíîìó âçâîäó ÎÌÎÍÀ (èëè ÷òî ó íèõ òàì) è «Ðóêè îò êëàâû !» ñ âûíîñîì ñåðâåðà. Äà è òî, íàñêîëüêî ïîìíþ, ïðîâàëèâàëèñü òàêèå ïðåñòóïíèêè èç-çà ñâîåé æàäíîñòè, à íå èç-çà òîãî ÷òî êòî-òî ÷òî-òî ó íèõ ïîäñëóøàë. Âïîëíå ìîæåò áûòü ÷òî òàêèå ñëó÷àè íå àôèøèðóþòñÿ, è ïîýòîìó èíôîðìàöèè ìèíèìóì.
Ì-ïîñëåäîâàòåëüíîñòè
Îäíèì èç íàèáîëåå øèðîêî ïðèìåíÿåìûõ ñïîñîáîâ ôîðìèðîâàíèÿ ïñåâäîñëó÷àéíûõ ïîñëåäîâàòåëüíîñòåé ÿâëÿåòñÿ ñïîñîá, îñíîâàííûé íà èñïîëüçîâàíèè ñîîòíîøåíèÿ:

(2.1)
ãäå k - íîìåð òàêòà; akÎ{0, 1}-ñèìâîëû ïîñëåäîâàòåëüíîñòè;
aiÎ{0, 1}-ïîñòîÿííûå êîýôôèöèåíòû;

- îïåðàöèÿ ñóììèðîâàíèÿ ïî ìîäóëþ äâà m ëîãè÷åñêèõ ïåðåìåííûõ.
Ïðè ñîîòâåòñòâóþùåì âûáîðå êîýôôèöèåíòîâ ai, íà îñíîâàíèè õàðàêòåðèñòè÷åñêîãî ïîëèíîìà j(x)=1Åa1x1Åa2x2a3x3…am-1xm-1amxm, êîòîðûé äîëæåí áûòü ïðèìèòèâíûì, ïîñëåäîâàòåëüíîñòü áèò {ak} èìååò ìàêñèìàëüíóþ äëèíó, ðàâíóþ 2m-1. Òàêàÿ ïîñëåäîâàòåëüíîñòü íàçûâàåòñÿ M-ïîñëåäîâàòåëüíîñòüþ.
Ãëàâíîå ïðåèìóùåñòâî ìåòîäà ôîðìèðîâàíèÿ ïñåâäîñëó÷àéíûõ ïîñëåäîâàòåëüíîñòåé ïî ñîîòíîøåíèþ (2.1) - ïðîñòîòà åãî ðåàëèçàöèè, êàê ïðîãðàììíîé, òàê è àïïàðàòóðíîé.
Íåêîòîðûìè èç íàèáîëåå âàæíûõ äëÿ íàñ ñâîéñòâ Ì-ïîñëåäîâàòåëüíîñòåé ÿâëÿþòñÿ:
- ìàêñèìàëüíàÿ áëèçîñòü Ì-ïîñëåäîâàòåëüíîñòè ïî õàðàêòåðèñòèêàì ê ñëó÷àéíîé;
- ïåðèîä ïîñëåäîâàòåëüíîñòè, ôîðìèðóåìîé ïî âûðàæåíèþ (2.1), îïðåäåëÿåòñÿ ñòàðøåé ñòåïåíüþ ïîðîæäàþùåãî ïîëèíîìà j(x) è ðàâåí L = 2m-1;
- äëÿ çàäàííîãî ïîëèíîìà j(õ) ñóùåñòâóåò L ðàçëè÷íûõ
M-ïîñëåäîâàòåëüíîñòåé, îòëè÷àþùèõñÿ ôàçîâûì ñäâèãîì.
Íåìíîãî òåîðèè
Îäíèìè èç ýòàïîâ øèôðîâàíèÿ â ñèììåòðè÷íûõ êðèïòîñèñòåìàõ ÿâëÿåòñÿ ãàììèðîâàíèå è ãàììèðîâàíèå ñ îáðàòíîé ñâÿçüþ.
Ãàììèðîâàíèå – íàëîæåíèå ãàììû (îáû÷íî ïñåâäîñëó÷àéíîé ïîñëåäîâàòåëüíîñòè) íà òåêñò îáðàòèìûì îáðàçîì.
Ãàììèðîâàíèå ñ îáðàòíîé ñâÿçüþ – çíà÷åíèå çàøèôðîâàííîãî ñèìâîëà çàâèñèò íå òîëüêî îò ãàììû, íî è îò ïðåäûäóùèõ ñèìâîëîâ.
Îñòàëüíûå ýòàïû ðàññìàòðèâàòü íå áóäåì, ïîñêîëüêó äëÿ íèõ íè÷åãî íîâîãî ïðåäëîæåíî íå áóäåò, è èõ áåç ïðîáëåì ìîæíî áóäåò äîáàâèòü ê ïðåäëàãàåìîìó àëãîðèòìó.
Íàøà çàäà÷à ñîñòîèò â òîì, ÷òîáû îáåñïå÷èòü òàêîå ãàììèðîâàíèå ñ îáðàòíîé ñâÿçüþ, êîòîðîå áû ïðèâîäèëî ê ïîëíîìó èçìåíåíèþ òåêñòà íà âûõîäå äàæå ïðè íåñóùåñòâåííîì èçìåíåíèè âõîäíîãî. Ðàññìîòðèì íåìíîãî òåîðèè (èçëàãàåòñÿ ñîêðàùåííî ïî [2]).
Îáùèé âèä àëãîðèòìà
Äëÿ òîãî ÷òîáû èçìåíåíèå îäíîãî áèòà (èëè ãðóïïû áèòîâ) âîçäåéñòâîâàëî íà âñå îñòàëüíûå, ïîñòóïèì ñëåäóþùèì îáðàçîì: áóäåì âû÷èñëÿòü ñèãíàòóðó äâîè÷íîé ïîñëåäîâàòåëüíîñòè è îäíîâðåìåííî íåêîòîðîé ôóíêöèåé ïðåîáðàçîâûâàòü áèòû, ñèãíàòóðà äëÿ êîòîðûõ óæå ðàññ÷èòàíà. Åñòåñòâåííî, ýòà ôóíêöèÿ äîëæíà èìåòü ñîîòâåòñòâóþùóþ åé îáðàòíóþ ôóíêöèþ äëÿ âîññòàíîâëåíèÿ èñõîäíîãî òåêñòà. Ïðåîáðàçîâûâàòü ìîæíî êàê îäèí áèò, òàê ñðàçó è ãðóïïó áèòîâ. Øàã àëãîðèòìà ìîæåò áûòü äëèíîé êàê â îäèí áèò, òàê è â íåñêîëüêî áèò.
Äëÿ ïðîñòîòû ïîíèìàíèÿ ðàññìîòðèì àëãîðèòì, ñ ôóíêöèåé, ïðåîáðàçóþùèé îäèí áèò, è øàãîì â îäèí áèò.
k – äëèíà ïîñëåäîâàòåëüíîñòè, áèò;
m – ñòàðøàÿ ñòåïåíü ïîëèíîìà äëÿ ðàñ÷¸òà ñèãíàòóðû, à òàêæå êîëè÷åñòâî áèò â ýëåìåíòàõ ïàìÿòè (prev è next), õðàíÿùèõ ñèãíàòóðó;
ñèãíàòóðà(ïðåäûäóùàÿ ñèãíàòóðà, íîâûé áèò) – ôóíêöèÿ, îñóùåñòâëÿþùàÿ ñæàòèå ïîñëåäîâàòåëüíîñòè â ñèãíàòóðó;
f(x, ai) – ôóíêöèÿ, îñóùåñòâëÿþùàÿ ïðåîáðàçîâàíèå áèòà ai íåêîòîðûì ÷èñëîì
x;
ai – i-ûé áèò ïîñëåäîâàòåëüíîñòè.
Áàçîâîå ïðåîáðàçîâàíèå (ïðÿìîé õîä) áóäåò âûãëÿäåòü òàê:
(3.1)
prev = 0;
äëÿ i îò 1 äî k
{
next = ñèãíàòóðà(prev, ai);
ai = f(prev, ai);
prev = next;
}
Îáðàòíîå ïðåîáðàçîâàíèå (ïðÿìîé õîä) áóäåò âûãëÿäåòü òàê:
(3.2)
prev = 0;
äëÿ i îò 1 äî k
{
ai = f
-1(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
Êàê âèäèì, èçìåíåíèå áèòà ai âîçäåéñòâóåò íà âñå ïîñëåäóþùèå áèòû, è âåðîÿòíîñòü òîãî, ÷òî èçìåíåíèå ýòîãî áèòà îòðàçèòüñÿ íà ïîñëåäóþùèõ, î÷åíü áëèçêà ê åäèíèöå. À ÷òî æå äåëàòü ñ áèòàìè, ïðåäøåñòâóþùèìè ai, âåäü èçìåíåíèå èõ íå çàòðîíåò? Ïîñòóïèì ïðîñòî – ñîâåðøèì òàêîå æå ïðåîáðàçîâàíèå ïîâòîðíî, íî â îáðàòíîì íàïðàâëåíèè.
Áàçîâîå ïðåîáðàçîâàíèå, îáðàòíûé õîä:
(3.3)
prev = 0;
äëÿ i îò k äî 1
{
next = ñèãíàòóðà(prev, ai);
ai = f(prev, ai);
prev = next;
}
Îáðàòíîå ïðåîáðàçîâàíèå, îáðàòíûé õîä:
(3.4)
prev = 0;
äëÿ i îò k äî 1
{
ai = f
-1(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
Ïðåîáðàçîâàíèÿ (3.1) è (3.3) ðàçíîñÿò èçìåíåíèÿ â ëþáîé òî÷êå ïîñëåäîâàòåëüíîñòè íà âñþ ïîñëåäîâàòåëüíîñòü öåëèêîì òàêèì îáðàçîì, ÷òî êàæäûé áèò ñòàíîâèòñÿ ñâÿçàííûì ñî âñåìè îñòàëüíûìè, è åãî èçìåíåíèå ïîâëå÷¸ò èçìåíåíèå îñòàëüíûõ áèòîâ ñ âåðîÿòíîñòüþ, î÷åíü áëèçêîé ê åäèíèöå. Äëÿ âîññòàíîâëåíèÿ èñõîäíîãî òåêñòà íàäî ïðèìåíèòü ïîñëåäîâàòåëüíî ïðåîáðàçîâàíèÿ (3.2) è (3.4).
Íî âûøåîïèñàííîå îáåñïå÷èâàåò ïîëíîöåííîå âîçäåéñòâèå èçìåíåíèé òîëüêî ïðè ïðåîáðàçîâàíèè èñõîäíîãî òåêñòà â çàøèôðîâàííûé, ïðè îáðàòíîì ïðåîáðàçîâàíèè âîçäåéñòâèå èçìåíåíèé â çàøèôðîâàííîì òåêñòå íà âîññòàíàâëèâàåìûé èñõîäíûé áóäåò ñëàáî. Ðåøàåòñÿ ýòî ïðîñòî – ââîäèì äîïîëíèòåëüíî ïîñëå (3.1) è (3.3) ïðåîáðàçîâàíèÿ, àíàëîãè÷íûå (3.2) è (3.4), òîëüêî èñïîëüçóåì íå f –1(x, y), à f(x, y).
Âûãëÿäåòü ýòî áóäåò òàê:
Îñíîâíàÿ èäåÿ
Íåêîòîðûìè èç òðåáîâàíèé, ïðåäúÿâëÿåìûõ ê êðèïòîñèñòåìàì, ÿâëÿþòñÿ [1]:
- ÷èñëî îïåðàöèé, íåîáõîäèìûõ äëÿ îïðåäåëåíèÿ èñïîëüçîâàííîãî êëþ÷à øèôðîâàíèÿ ïî ôðàãìåíòó øèôðîâàííîãî ñîîáùåíèÿ è ñîîòâåòñòâóþùåãî åìó îòêðûòîãî òåêñòà, äîëæíî áûòü íå ìåíüøå îáùåãî ÷èñëà âîçìîæíûõ êëþ÷åé;
- íåçíà÷èòåëüíîå èçìåíåíèå êëþ÷à äîëæíî ïðèâîäèòü ê ñóùåñòâåííîìó èçìåíåíèþ âèäà çàøèôðîâàííîãî ñîîáùåíèÿ äàæå ïðè èñïîëüçîâàíèè îäíîãî è òîãî æå êëþ÷à.
Òî åñòü êðèïòîàëãîðèòì äîëæåí îáåñïå÷èòü íåâîçìîæíîñòü àíàëèçà çàøèôðîâàííîãî òåêñòà. Çàäà÷è êðèïòîàíàëèçà, â ÷àñòíîñòè, ñîñòîÿò â óñòàíîâëåíèè çàâèñèìîñòåé ìåæäó çàøèôðîâàííûì è èñõîäíûì òåêñòîì (èëè åãî ôðàãìåíòîì) áåç çíàíèÿ êëþ÷à. Êðèïòîàëãîðèòì æå íàäî ñòðîèòü òàêèì îáðàçîì, ÷òîáû òðóäî¸ìêîñòü àíàëèçà áûëà íå íèæå ïîëíîãî ïåðåáîðà âñåãî ìíîæåñòâà âîçìîæíûõ êëþ÷åé.
Èäåÿ òàêîâà: îáåñïå÷èòü âëèÿíèå ëþáîãî áèòà òåêñòà íà âñå îñòàëüíûå òàêèì îáðàçîì, ÷òîáû èìåÿ äâà îäèíàêîâûõ èñõîäíûõ òåêñòà, èçìåíèâ ëþáîé áèò (èëè ãðóïïó áèòîâ) îäíîãî òåêñòà, íà âûõîäå ïîëó÷èòü äâà ñîâåðøåííî ðàçëè÷íûõ òåêñòà (â èäåàëå îòëè÷àþùèõñÿ ìåæäó ñîáîé êàê äâå ñëó÷àéíûå ïîñëåäîâàòåëüíîñòè). Àíàëîãè÷íûå òðåáîâàíèÿ ïðåäúÿâëÿþòñÿ ê îáðàòíîìó ïðåîáðàçîâàíèþ è ê èçìåíåíèþ êëþ÷à.
P.S.
Íà äàííûé ìîìåíò â ïðîãðàììå-ïðèìåðå äîñòóïíîé íà ìîåé ñòðàíè÷êå èñïîëüçóåòñÿ ïðèìèòèâíûé ïîëèíîì 1Åx502Åx607, òàê æå èñõîäíûé êîä ïî ñðàâíåíèþ ñ ïðèâîäèìûì çäåñü óëó÷øåí è îïòèìèçèðîâàí, è ðàáîòàåò íà ïîðÿäîê áûñòðåå.
Ìàëåíüêîå çàìå÷àíèå: åñëè äëÿ ãåíåðèðîâàíèÿ ãàììû èñïîëüçóåòñÿ ïðèìèòèâíûé ïîëèíîì, òî ïëîõèõ ïàðîëåé íå ñóùåñòâóåò. Òî÷íåå ñóùåñòâóåò, íî îí åäèíñòâåííûé – ïîëíîñòüþ íóëåâîé.
Âòîðîå çàìå÷àíèå: äëÿ ëó÷øåé ñòîéêîñòè íà÷àëüíîå çíà÷åíèå ñèãíàòóðû ëó÷øå èíèöèàëèçèðîâàòü íà îñíîâå êëþ÷à èëè ãàììû, îñîáåííî äëÿ ïîòîêîâîé âåðñèè.
Ïîäõîä ê ñîçäàíèþ òðóäíîàíàëèçèðóåìûõ øèôðîâ
Áðèëþê Äìèòðèé Âèòàëüåâè÷
bdv78@newmail.ru
http://bdv78.newmail.ru
Ïðîãðàììíàÿ ðåàëèçàöèÿ (ÿçûê Ñ)
Ïðèìå÷àíèå: ïðåäïîëàãàåòñÿ ÷òî òèïû int è unsigned èìåþò ðàçìåð 4 áàéòà.
Ïðèìåð ôóíêöèè, ãåíåðèðóþùåé ïîáèòíî ïñåâäîñëó÷àéíóþ ïîñëåäîâàòåëüíîñòü:
// ïðèìèòèâíûé íåïðèâîäèìûé ïîëèíîì äëÿ ôîðìèðîâàíèÿ
// Ì-ïîñëåäîâàòåëüíîñòè ñ ïåðèîäîì (2^11)-1
// fi(x) = 1(+)x^2(+)x^11
unsigned NextMValue(unsigned prev)
{
register unsigned c = 0;
if(prev & (1<<1))
c++;
if(prev & (1<<10))
c++;
return (prev<<1)|(c&1);
}
Íà÷àëüíîå çíà÷åíèå ïàðàìåòðà prev ìîæåò áûòü ëþáûì, îòëè÷íûì îò íóëÿ, íîâûé áèò ïîñëåäîâàòåëüíîñòè õðàíèòñÿ â íóëåâîì áèòå âîçâðàùàåìîãî çíà÷åíèÿ.
Ïðèìåð ôóíêöèè, ïîáèòíî ñæèìàþùåé äâîè÷íóþ ïîñëåäîâàòåëüíîñòü â ñèãíàòóðó:
// ïðèìèòèâíûé íåïðèâîäèìûé ïîëèíîì
// äëÿ âû÷èñëåíèÿ 32-áèòíîé ñèãíàòóðû
// fi(x) = 1(+)x^1(+)x^27(+)x^28(+)x^32
unsigned NextSignature32
(unsigned prev, unsigned newbit)
{
if(prev&(1<<0))
newbit++;
if(prev&(1<<26))
newbit++;
if(prev&(1<<27))
newbit++;
if(prev&(1<<31))
newbit++;
return (prev<<1)|(newbit&1);
}
Äëÿ ãåíåðàöèè ãàììû íà îñíîâàíèè êëþ÷à áóäåì ïðèìåíÿòü ñëåäóþùóþ ôóíêöèþ:
unsigned char * generate_gamma(unsigned char *pw, unsigned pwlen, unsigned gamma_len, unsigned char * gamma = NULL)
{
const
gb_len = 256;
static int
polynomial[] = { 1, 5, 23, 171, 243, 1057, 2047, -1 };
//polynomial[] = { 1, 18, 20, 39, -1 }; // ïåðèîä 2^40 - 1
static unsigned char
buf[gb_len+1];
memset(buf, 0, sizeof(buf));
if(pwlen)
for(int i = 0; i < gb_len; i++)
buf[i+1] = pw[i%pwlen];
else
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[1] = 1;
ÿÿÿÿÿÿÿÿÿÿÿ if(!gamma)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ gamma = new unsigned char [gamma_len];
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = 0; i < gamma_len; i++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[0] = 0;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ for(int j = 0; j < 8; j++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ register unsigned char newbit = 0;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ for(int k = 0; polynomial[k] >= 0; k++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ register unsigned bit = (polynomial[k]+8-j);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ if(buf[bit>>3]&(1<<(bit&7)))
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ newbit++;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[0] |= (newbit&1)<<(7-j);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ memmove(buf+1, buf, gb_len);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ gamma[i] = buf[0];
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ return gamma;
}
�â äãªæ¨ï ¬®¦¥â ®¯¥à¨à®¢ âì «î¡ë¬ ¯®«¨®¬®¬. �ਢ¥¤ñ ¯®«¨®¬ á⥯¥¨ 2048, ¨«¨ 256 ¡ ©â. ‡ ¤ ¢ âì ¯ à®«ì ¤«¨¥¥ 256 ¡ ©â ¥ ¨¬¥¥â á¬ëá« , ¯®áª®«ìªã íâ® ¨ª ª ¥ ®âà §¨âáï £¥¥à¨à㥬®© £ ¬¬¥. Š®¥ç® ¬®¦® ¯à¥¤¢ à¨â¥«ì® ¯®¤¢¥à£ãâì ¯ ஫ì á¢ñà⪥, ® ¢¥¤ì ⮣¤ ¤«ï ¢áªàëâ¨ï ¬®¦® ¡ã¤¥â ¯¥à¥¡¨à âì ⮫쪮 256 ¡ ©â ¨§ á¢ñà⪨, ª®â®àë¥ ¨ ¨á¯®«ì§ãîâáï ¤«ï £¥¥à 樨 £ ¬¬ë. �®«¨®¬ ¢§ïâ <á ¯®â®«ª >, ¯®í⮬㠤«ï ¤ñ¦®© £¥¥à 樨 £ ¬¬ë á«¥¤ã¥â ¨á¯®«ì§®¢ âì ¯à¨¬¨â¨¢ë© ¥¯à¨¢®¤¨¬ë© ¯®«¨®¬. ‚ ª®¬¬¥â à¨ïå 㪠§ ¯à¨¬¨â¨¢ë© ¯®«¨®¬ á⥯¥¨ 40, ¤«ï ª®â®à®£® ¢àãçãî ¡ë« ¯à®¢¥à¥ ¯à ¢¨«ì®áâì à ¡®âë ¯à®æ¥¤ãàë. �à ¢¤ ¬ ªá¨¬ «ì ï ¤«¨ ª«îç ¤«ï ¥£® ¢á¥£® «¨èì ¯ïâì ¡ ©â L.
‚ [1] 㪠§ë¢ «¨áì ¥¤®áâ ⪨ ¢ ¯à¨¬¥¥¨¨ Œ-¯®á«¥¤®¢ ⥫ì®á⥩ ¤«ï £¥¥à 樨 £ ¬¬ë, ¨ ¯à¥¤« £ «®áì ¨á¯®«ì§®¢ âì ¯®á«¥¤®¢ ⥫ì®á⨠ƒ®«¤ , ®¡à §ãî騥áï á㬬¨à®¢ ¨¥¬ ¥áª®«ìª¨å Œ-¯®á«¥¤®¢ ⥫ì®á⥩.
„«ï ¯à®áâ®âë è «£®à¨â¬ ¡ã¤¥â à ¡®â âì á ¡ ©â ¬¨, ¨ ᨣ âãà ¡ã¤¥â ¢ëç¨á«ïâìáï áà §ã ¤«ï ¢á¥£® ¡ ©â .
„«ï ᦠâ¨ï ¯®á«¥¤®¢ ⥫ì®á⨠¢ ᨣ âãà㠨ᯮ«ì§ã¥¬ ¨§¢¥áâãî ¨ ®¯â¨¬¨§¨à®¢ ãî äãªæ¨î crc32ÿ (¯à¨« £ ¥âáï á ¨á室묨 ⥪áâ ¬¨):
unsigned crc32tab[] = {
ÿÿÿÿÿÿÿÿÿÿÿ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
ÿÿÿÿÿÿÿÿÿÿÿ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
ÿÿÿÿÿÿÿÿÿÿÿ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
ÿÿÿÿÿÿÿÿÿÿÿ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
ÿÿÿÿÿÿÿÿÿÿÿ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
ÿÿÿÿÿÿÿÿÿÿÿ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
ÿÿÿÿÿÿÿÿÿÿÿ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
ÿÿÿÿÿÿÿÿÿÿÿ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
ÿÿÿÿÿÿÿÿÿÿÿ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
ÿÿÿÿÿÿÿÿÿÿÿ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
ÿÿÿÿÿÿÿÿÿÿÿ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
ÿÿÿÿÿÿÿÿÿÿÿ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
ÿÿÿÿÿÿÿÿÿÿÿ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
ÿÿÿÿÿÿÿÿÿÿÿ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
ÿÿÿÿÿÿÿÿÿÿÿ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
ÿÿÿÿÿÿÿÿÿÿÿ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
ÿÿÿÿÿÿÿÿÿÿÿ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
ÿÿÿÿÿÿÿÿÿÿÿ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
ÿÿÿÿÿÿÿÿÿÿÿ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
ÿÿÿÿÿÿÿÿÿÿÿ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
ÿÿÿÿÿÿÿÿÿÿÿ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
ÿÿÿÿÿÿÿÿÿÿÿ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
ÿÿÿÿÿÿÿÿÿÿÿ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
ÿÿÿÿÿÿÿÿÿÿÿ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
ÿÿÿÿÿÿÿÿÿÿÿ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
ÿÿÿÿÿÿÿÿÿÿÿ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
ÿÿÿÿÿÿÿÿÿÿÿ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
ÿÿÿÿÿÿÿÿÿÿÿ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
ÿÿÿÿÿÿÿÿÿÿÿ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
ÿÿÿÿÿÿÿÿÿÿÿ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
ÿÿÿÿÿÿÿÿÿÿÿ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
ÿÿÿÿÿÿÿÿÿÿÿ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
ÿÿÿÿÿÿÿÿÿÿÿ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
ÿÿÿÿÿÿÿÿÿÿÿ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
ÿÿÿÿÿÿÿÿÿÿÿ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
ÿÿÿÿÿÿÿÿÿÿÿ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
ÿÿÿÿÿÿÿÿÿÿÿ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
ÿÿÿÿÿÿÿÿÿÿÿ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
ÿÿÿÿÿÿÿÿÿÿÿ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
ÿÿÿÿÿÿÿÿÿÿÿ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
ÿÿÿÿÿÿÿÿÿÿÿ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
ÿÿÿÿÿÿÿÿÿÿÿ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
ÿÿÿÿÿÿÿÿÿÿÿ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
ÿÿÿÿÿÿÿÿÿÿÿ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
ÿÿÿÿÿÿÿÿÿÿÿ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
ÿÿÿÿÿÿÿÿÿÿÿ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
ÿÿÿÿÿÿÿÿÿÿÿ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
ÿÿÿÿÿÿÿÿÿÿÿ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
ÿÿÿÿÿÿÿÿÿÿÿ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
ÿÿÿÿÿÿÿÿÿÿÿ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
ÿÿÿÿÿÿÿÿÿÿÿ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
ÿÿÿÿÿÿÿÿÿÿÿ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
ÿÿÿÿÿÿÿÿÿÿÿ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
ÿÿÿÿÿÿÿÿÿÿÿ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
ÿÿÿÿÿÿÿÿÿÿÿ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
ÿÿÿÿÿÿÿÿÿÿÿ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
ÿÿÿÿÿÿÿÿÿÿÿ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
ÿÿÿÿÿÿÿÿÿÿÿ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
ÿÿÿÿÿÿÿÿÿÿÿ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
ÿÿÿÿÿÿÿÿÿÿÿ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
ÿÿÿÿÿÿÿÿÿÿÿ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
ÿÿÿÿÿÿÿÿÿÿÿ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
ÿÿÿÿÿÿÿÿÿÿÿ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
ÿÿÿÿÿÿÿÿÿÿÿ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
// polynomial is
// X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
unsigned crc32( unsigned crc, unsigned char *buf, unsigned buflen)
{
ÿÿÿÿÿÿÿÿÿÿÿ for(unsigned i = 0; i < buflen; i++)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ crc = crc32tab[(unsigned char)(crc ^ unsigned(buf[i]))] ^ ((crc >> 8) & 0x00ffffff);
ÿÿÿÿÿÿÿÿÿÿÿ return crc;
}
”ãªæ¨¨ § è¨ä஢ª¨/à áè¨ä஢ª¨:
void encrypt(unsigned char * buf, unsigned buflen, unsigned char * gamma)
{
ÿÿÿÿÿÿÿÿÿÿÿ unsigned prev, next;
ÿÿÿÿÿÿÿÿÿÿÿ unsigned char * pgamma;
ÿÿÿÿÿÿÿÿÿÿÿ // ä § 1
ÿÿÿÿÿÿÿÿÿÿÿ // § é¨â ®â ¨§¬¥¥¨© ¢ ¨á室®¬ ⥪áâ¥
ÿÿÿÿÿÿÿÿÿÿÿ // á¢ñà⪠1 - ¯àאַ© 室
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = 0; i < buflen; i++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(next, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] += prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = next;
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // á¢ñà⪠2 - ®¡à âë© å®¤
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+buflen;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = buflen-1; i >= 0; i--) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(next, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] += prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = next;
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // ä § 2
ÿÿÿÿÿÿÿÿÿÿÿ // § é¨â ®â ¨§¬¥¥¨© ¢ è¨ä஢ ®¬ ⥪áâ¥
ÿÿÿÿÿÿÿÿÿÿÿ // á¢ñà⪠3 - ¯àאַ© 室
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+(buflen<<1);
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = 0; i < buflen; i++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] += prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // á¢ñà⪠4 - ®¡à âë© å®¤
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+(buflen<<1)+buflen;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = buflen-1; i >= 0; i--) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] += prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿ }
}
void decrypt(unsigned char * buf, unsigned buflen, unsigned char * gamma)
{
ÿÿÿÿÿÿÿÿÿÿÿ unsigned prev, next;
ÿÿÿÿÿÿÿÿÿÿÿ unsigned char * pgamma;
ÿÿÿÿÿÿÿÿÿÿÿ // à §¢ñà⪠4 - ®¡à âë© å®¤
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+(buflen<<1)+buflen;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = buflen-1; i >= 0; i--) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(next, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] -= prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = next;
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // à §¢ñà⪠3 - ¯àאַ© 室
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+(buflen<<1);
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = 0; i < buflen; i++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ next = crc32(next, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] -= prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = next;
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // à §¢ñà⪠2 - ®¡à âë© å®¤
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma+buflen;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = buflen-1; i >= 0; i--) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] -= prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿ }
ÿÿÿÿÿÿÿÿÿÿÿ // à §¢ñà⪠1 - ¯àאַ© 室
ÿÿÿÿÿÿÿÿÿÿÿ prev = 0xffffffff;
ÿÿÿÿÿÿÿÿÿÿÿ pgamma = gamma;
ÿÿÿÿÿÿÿÿÿÿÿ for(int i = 0; i < buflen; i++) {
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ buf[i] -= prev;
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, buf+i, 1);
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ prev = crc32(prev, pgamma+i, 1);ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ // £ ¬¬¨à®¢ ¨¥
ÿÿÿÿÿÿÿÿÿÿÿ }
}
”ãªæ¨ï è¨ä஢ ¨ï ä ©« :
int cryptfile(int encrypt, char *fn, unsigned char *pw, unsigned pwlen)
{
ÿÿÿÿÿÿÿÿÿÿÿ FILE * f = fopen(fn, "r+b");
ÿÿÿÿÿÿÿÿÿÿÿ unsigned char * buf, * gamma;
ÿÿÿÿÿÿÿÿÿÿÿ unsigned buflen;
ÿÿÿÿÿÿÿÿÿÿÿ if(!f)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ return -1;
ÿÿÿÿÿÿÿÿÿÿÿ buflen = filelength(f->fd);
ÿÿÿÿÿÿÿÿÿÿÿ buf = new char[buflen];
ÿÿÿÿÿÿÿÿÿÿÿ gamma = generate_gamma(pw, pwlen, buflen<<2);
ÿÿÿÿÿÿÿÿÿÿÿ fread(buf, buflen, 1, f);
ÿÿÿÿÿÿÿÿÿÿÿ if(encrypt)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ encrypt(buf, buflen, gamma);
ÿÿÿÿÿÿÿÿÿÿÿ else
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ decrypt(buf, buflen, gamma);
ÿÿÿÿÿÿÿÿÿÿÿ rewind(f);
ÿÿÿÿÿÿÿÿÿÿÿ fwrite(buf, buflen, 1, f);
ÿÿÿÿÿÿÿÿÿÿÿ memset(buf, 0xff, buflen);
ÿÿÿÿÿÿÿÿÿÿÿ memset(buf, 0, buflen);
ÿÿÿÿÿÿÿÿÿÿÿ memset(gamma, 0xff, buflen<<2);
ÿÿÿÿÿÿÿÿÿÿÿ memset(gamma, 0, buflen<<2);
ÿÿÿÿÿÿÿÿÿÿÿ delete buf;
ÿÿÿÿÿÿÿÿÿÿÿ delete gamma;
ÿÿÿÿÿÿÿÿÿÿÿ fclose(f);
ÿÿÿÿÿÿÿÿÿÿÿ return 0;
}
�஢®¤¨«áï ¥¡®«ì让 «¨§ ᮢ¯ ¤¥¨¥ ¡ ©â ¢ ¯à¥®¡à §®¢ ëå â ª¨¬ ®¡à §®¬ ä ©« å. „«ï ç¥âëàñå ä ©«®¢, ¨á室®£®, á ¨§¬¥ñë¬ ®¤¨¬ ¡¨â®¬ ¢ ç «¥, ª®æ¥ ¨ á¥à¥¤¨¥ ä ©« , ᮢ¯ ¤¥¨¥ ¡ ©â (¯®¯ à®, ª ¦¤ë© á ª ¦¤ë¬) á®áâ ¢¨«® ¬¥¥¥ 0.5%. �®á«¥ ᦠâ¨ï à娢 â®à®¬ RAR ¢á¥å ç¥âëàñå ä ©«®¢ ¢ ®¤¨ solid- à娢 à §¬¥à ª ¦¤®£® ä ©« 㢥«¨ç¨«áï (¢®â â ª ;). ‚ ¯à¨« £ ¥¬®© ¯à®£à ¬¬¥ ¬®¦® á ¬®áâ®ïâ¥«ì® ¯®íªá¯¥à¨¬¥â¨à®¢ âì á è¨ä஢ª®© à §«¨çëå ä ©«®¢. ˆ¬¥¥âáï ª®¬ ¤ áà ¢¥¨ï ¤¢ãå ä ©«®¢. �ਠ¯à¥®¡à §®¢ ¨¨ ¤¢ãå ä ©«®¢ ®¨ ¢â®¬ â¨ç¥áª¨ áà ¢¨¢ îâáï. �®¯à®¡ã©â¥ ¨§¬¥¨âì ¥áª®«ìª® ¡¨â, ¯®á¬®âà¨â¥ çâ® ¡ã¤¥â. Š®¬ã ¬ «®, ¬®¦¥â ãᮢ¥àè¥á⢮¢ âì ¨áå®¤ë¥ â¥ªáâë ¨ íªá¯¥à¨¬¥â¨à®¢ âì ¤ «ìè¥.
Ðàñøèôðîâêà
// îáðàòíûé õîä (3.8)-1
prev = 0;
äëÿ i îò k äî 1
{
next = ñèãíàòóðà(prev, ai);
ai = f
-1(prev, ai);
prev = next;
}
// ïðÿìîé õîä (3.7)-1
prev = 0;
äëÿ i îò 1 äî k
{
next = ñèãíàòóðà(prev, ai);
ai = f
-1(prev, ai);
prev = next;
}
// îáðàòíûé õîä (3.6)-1
prev = 0;
äëÿ i îò k äî 1
{
ai = f
-1(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
// ïðÿìîé õîä (3.5)-1
prev = 0;
äëÿ i îò 1 äî k
{
ai = f
-1(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
Îäíîé èç ðàííèõ èäåé ïðåîáðàçîâàíèé ïîäîáíîãî ðîäà áûëà òàêàÿ: òåêñò ðàçáèâàåòñÿ íà äâå ïîëîâèíêè, âû÷èñëÿåòñÿ ñèãíàòóðà ïåðâîé ïîëîâèíû è ñ ïîìîùüþ ýòîé ñèãíàòóðû ïðåîáðàçóåòñÿ âòîðàÿ ïîëîâèíà, çàòåì íàîáîðîò. Êàæäàÿ èç ýòèõ ïîëîâèíîê îïÿòü ðàçáèâàåòñÿ íà äâå, è ïðåîáðàçîâàíèå ïîâòîðÿåòñÿ ðåêóðñèâíî, ïîêà äëèíà ïîëîâèíêè íå ñòàíåò ìåíüøå îäíîãî áèòà (èëè áàéòà). Âðåìÿ òàêîãî ïðåîáðàçîâàíèÿ – ïîðÿäêà äâîè÷íîãî ëîãàðèôìà îò äëèíû ïîñëåäîâàòåëüíîñòè.
Ñëåäóåò îòìåòèòü, ÷òî äëÿ êàæäîãî èç ÷åòûð¸õ áàçîâûõ ïðåîáðàçîâàíèé ìîæíî èñïîëüçîâàòü ðàçëè÷íûå ôóíêöèè ïðåîáðàçîâàíèÿ è ïîëèíîìû äëÿ ðàñ÷¸òà ñèãíàòóð, ÷òî ìîæåò ïîâûñèòü êðèïòîñòîéêîñòü.
Êàê ìîæíî áûëî çàìåòèòü, ïðåîáðàçîâàíèå îñóùåñòâëÿåòñÿ áåç êàêîãî-ëèáî ïðèâëå÷åíèÿ êëþ÷à, è èìååò ìåñòî îäíîçíà÷íîå ñîîòâåòñòâèå èñõîäíîé è ïðåîáðàçîâàííîé ïîñëåäîâàòåëüíîñòè. Èçìåíèâ âèä ôóíêöèè íà f(ñèãíàòóðài, gi, ai), ãäå g – ïñåâäîñëó÷àéíàÿ ïîñëåäîâàòåëüíîñòü, ñãåíåðèðîâàííàÿ íà îñíîâå êëþ÷à (èëè ñàì êëþ÷, íî ýòî ñíèçèò êðèïòîñòîéêîñòü), ïîëó÷èì çàâèñèìîñòü ïðåîáðàçîâàííîé ïîñëåäîâàòåëüíîñòè îò êëþ÷à. Äëÿ êàæäîãî èç ïðåîáðàçîâàíèé ìîæíî èñïîëüçîâàòü ðàçëè÷íûå ó÷àñòêè ãàììû. Ïðè÷¸ì èç âûøåîïèñàííîãî ñëåäóåò òî, ÷òî ìàëåéøåå èçìåíåíèå êëþ÷à ïðèâåä¸ò ê ãëîáàëüíîìó èçìåíåíèþ âñåé ïðåîáðàçîâàííîé ïîñëåäîâàòåëüíîñòè.
Ïî êðèïòîñòîéêîñòè ïðÿìîå è îáðàòíîå ïðåîáðàçîâàíèå ñèììåòðè÷íû, ïîýòîìó ìîæíî ïîëüçîâàòüñÿ îáðàòíûì ïðåîáðàçîâàíèåì äëÿ çàøèôðîâêè è ïðÿìûì äëÿ ðàñøèôðîâêè.
Òàêîå ïðåîáðàçîâàíèå óæå íå íàçîâ¸øü ãàììèðîâàíèåì ñ îáðàòíîé ñâÿçüþ, êàê ýòî îïèñàíî â [1], ýòî óæå ñêîðåå ñâ¸ðòêà.
Èòàê, äàííûé àëãîðèòì îáåñïå÷èâàåò ñëåäóþùèå âîçìîæíîñòè: åñëè âçÿòü äâå èäåíòè÷íûå ïîñëåäîâàòåëüíîñòè, äâà èäåíòè÷íûõ êëþ÷à, è âíåñòè èçìåíåíèå (äàæå î÷åíü ìàëîå) â êëþ÷ èëè â èñõîäíóþ èëè â ïðåîáðàçîâàííóþ ïîñëåäîâàòåëüíîñòè, òî ïîñëå ñîîòâåòñòâóþùåãî ïðåîáðàçîâàíèÿ, äâå ïîëó÷åííûå ïîñëåäîâàòåëüíîñòè áóäóò ðàçëè÷àòüñÿ ìåæäó ñîáîé êàê äâå ñëó÷àéíûå. Ñîîòâåòñòâåííî àíàëèç çàøèôðîâàííîãî è ñîîòâåòñòâóþùåãî åìó èñõîäíîãî òåêñòà ñ öåëüþ îïðåäåëèòü êëþ÷ ìàëî ÷òî äàñò.
Äàííûé àëãîðèòì ìîæíî ïðèìåíèòü äëÿ ïîòîêîâîãî øèôðîâàíèÿ äàííûõ. Ïîñêîëüêó êîíå÷íàÿ ÷àñòü ïîñëåäîâàòåëüíîñòè â ðåàëüíîì âðåìåíè íåäîñòóïíà, ïðåîáðàçîâàíèÿ (3.6) è (3.8) ñëåäóåò èñêëþ÷èòü, à ïðåîáðàçîâàíèÿ (3.5) è (3.7) îáúåäåíèòü. Ñ îäíîé ñòîðîíû ýòî ïîâëèÿåò íà êðèïòîñòîéêîñòü, ïîñêîëüêó íåò âëèÿíèÿ ïîñëåäóþùèõ áèòîâ íà ïðåäûäóùèå, íî ñ äðóãîé ñòîðîíû êîíå÷íàÿ ÷àñòü ïîñëåäîâàòåëüíîñòè òàêæå íåäîñòóïíà äëÿ êðèïòîàíàëèçà. Åñëè ïðîöåññ ïåðåäà÷è äàííûõ äîïóñêàåò áóôåðèçàöèþ õîòÿ áû íåñêîëüêèõ áèò, òî ïðåîáðàçîâàíèÿ (3.6) è (3.8) ìîæíî ìîäèôèöèðîâàòü òàêèì îáðàçîì, ÷òîáû îíè îñóùåñòâëÿëèñü â ïðåäåëàõ áóôåðà. Ñëåäóåò ïðåäóñìîòðåòü ïðîöåññ âîññòàíîâëåíèÿ ñèãíàòóð â ñëó÷àå óòåðè èëè èñêàæåíèÿ ÷àñòè ñîîáùåíèÿ, íî ýòî óæå âûõîäèò çà ðàìêè ñòàòüè. Ïðîñòåéøèé ñïîñîá – óñòàíîâêà ñèãíàòóð â íà÷àëüíûå (êîíñòàíòíûå èëè îïðåäåëÿåìûå ïî íåêîòîðîìó çàêîíó) çíà÷åíèÿ ïîñëå ïðîõîæäåíèÿ îïðåäåë¸ííûõ îáú¸ìîâ äàííûõ è âñòàâêà ñèíõðîíèçèðóþùåé ìåòêè â ïîñëåäîâàòåëüíîñòü. Âûãëÿäåòü âñ¸ ýòî áóäåò ïðèáëèçèòåëüíî òàê:
// çàøèôðîâêà
prev = prev2 = 0;
ïîêà(íå êîíåö ïîñëåäîâàòåëüíîñòè)
{
next = ñèãíàòóðà(prev, ai);
ai = f(prev, gi, ai);
prev = next;
ai = f(prev2, g’i, ai);
prev2 = ñèãíàòóðà(prev2, ai);
}
// ðàñøèôðîâêà
prev = prev2 = 0;
ïîêà(íå êîíåö ïîñëåäîâàòåëüíîñòè)
{
next2 = ñèãíàòóðà(prev2, ai);
ai = f
-1(prev2, g’i, ai);
prev2 = next2;
ai = f
-1(prev, gi, ai);
prev = ñèãíàòóðà(prev, ai);
}
Ñæàòèå äâîè÷íîé ïîñëåäîâàòåëüíîñòè â ñèãíàòóðó
Ñèãíàòóðà – ýòî íåáîëüøîé îáú¸ì èíôîðìàöèè, ìàêñèìàëüíî õàðàêòåðèçóþùåé äëèííóþ äâîè÷íóþ ïîñëåäîâàòåëüíîñòü. Ñóùíîñòü ñèãíàòóðû â òîì, ÷òî äëÿ äâóõ ðàçëè÷íûõ ïîñëåäîâàòåëüíîñòåé , ñèãíàòóðû, õàðàêòåðèçóþùèå èõ, ñ î÷åíü áîëüøîé âåðîÿòíîñòüþ ðàçëè÷àþòñÿ.
Äëÿ ñæàòèÿ äâîè÷íîé ïîñëåäîâàòåëüíîñòè â ñèãíàòóðó èñïîëüçóåì ñëåäóþùåå ñîîòíîøåíèå:

(2.2)
ãäå y(k) Î {0,1} – k-é ñèìâîë ñæèìàåìîé ïîñëåäîâàòåëüíîñòè {y(k)}, k = 1..l; aiÎ{0,1} – êîýôôèöèåíòû ïîðîæäàþùåãî ïîëèíîìà j(x); ai(k-1)Î{0,1} – ñîäåðæèìîå i-ãî ýëåìåíòà ïàìÿòè â k-1-é òàêò. Ïðîöåäóðà ñäâèãà èíôîðìàöèè îïèñûâàåòñÿ ñîîòíîøåíèåì
aj(k) = aj-1(k-1), j = 2..m.
Äëÿ îïèñàíèÿ ïðîöåäóðû ñæàòèÿ èíôîðìàöèè, îñíîâàííîé íà ïðèìåíåíèè ïðèìèòèâíûõ ïîëèíîìîâ, èñïîëüçóþòñÿ ðàçëè÷íûå ìàòåìàòè÷åñêèå ìîäåëè è àëãîðèòìû. Îäíîé èç íàèáîëåå ÷àñòî ïðèìåíÿåìûõ ÿâëÿåòñÿ ìîäåëü, ðåàëèçóþùàÿ èäåþ ïðåäñòàâëåíèÿ ïðîöåäóðû ñæàòèÿ èíôîðìàöèè êàê îïåðàöèþ äåëåíèÿ ïîëèíîìîâ íàä ïîëåì GF(2). Ïðè ýòîì â êà÷åñòâå äåëèìîãî èñïîëüçóåòñÿ ïîòîê ñæèìàåìûõ äàííûõ, îïèñûâàåìûõ ïîëèíîìîì c(x) ñòåïåíè l-1, ãäå l-êîëè÷åñòâî áèò â ïîñëåäîâàòåëüíîñòè. Òàê, íàïðèìåð, ïîñëåäîâàòåëüíîñòü 10011 èìååò âèä ïîëèíîìà c(õ) = x4ÅxÅ1. Äåëèòåëåì ñëóæèò ïðèìèòèâíûé ïîëèíîì y(õ), â ðåçóëüòàòå äåëåíèÿ íà êîòîðûé ïîëó÷àåòñÿ ÷àñòíîå q(õ) è îñòàòîê S(õ), ñâÿçàííûå êëàññè÷åñêèì ñîîòíîøåíèåì âèäà
c(x) = q(x)y(x) Å S(x), (2.3)
ãäå îñòàòîê S(õ), ïðåäñòàâëÿþùèé ñîáîé ïîëèíîì ñòåïåíè, ìåíüøåé, ÷åì
m = deg y(x), íàçûâàåòñÿ ñèãíàòóðîé.
Ðåçóëüòàò ñæàòèÿ C(x) (m-ðàçðÿäíîå ÷èñëî, ñîäåðæàùååñÿ â a1..am), ïîëó÷àþùèéñÿ ïî âûðàæåíèþ (2.2), íå ñîâïàäàåò ñ S(x), C(x)¹S(x), íî ëèíåéíî ñ íèì ñâÿçàí.
Êàêîâû æå âåðîÿòíîñòè òîãî, ÷òî ñèãíàòóðû ðàçëè÷àþòñÿ äëÿ äâóõ ðàçëè÷íûõ ïîñëåäîâàòåëüíîñòåé? Ñèãíàòóðû ðàçëè÷àþòñÿ äëÿ äâóõ ïîñëåäîâàòåëüíîñòåé ëþáîé äëèíû l, îòëè÷àþùèõñÿ íà îäèí áèò, è äëÿ âñåõ ïîñëåäîâàòåëüíîñòåé äëèíîé l£2m-1, îòëè÷àþùèõñÿ íà äâà ëþáûõ áèòà [2]. Äëÿ n-êðàòíûõ èçìåíåíèé (l=2m-2), ïðè äîñòàòî÷íî áîëüøîì m, ñèãíàòóðû ðàçëè÷àþòñÿ ñ âåðîÿòíîñòüþ » 1-1/2m, ÷òî ïðè m>7 ïðàêòè÷åñêè ðàâíî åäèíèöå. Åäèíñòâåííûé ïàðàìåòð, âëèÿþùèé íà çíà÷åíèÿ âåðîÿòíîñòè - ñòàðøàÿ ñòåïåíü m ïîëèíîìà j(õ). Äàëüíåéøèå óïîìèíàíèÿ î òàêèõ âåðîÿòíîñòÿõ áóäóò ìåíåå òî÷íû, ïîýòîìó êîãäà íàäî áóäåò óòî÷íèòü, îáðàùàéòåñü ê ýòîìó àáçàöó.
â ñåðü¸çíûõ öåëÿõ íåîáõîäèìî ñòðîãîå
Îïèñàííûé àëãîðèòì äîñòèãàåò ïîñòàâëåííûå öåëè.
Äëÿ èñïîëüçîâàíèÿ îïèñàííîãî àëãîðèòìà â ñåðü¸çíûõ öåëÿõ íåîáõîäèìî ñòðîãîå äîêàçàòåëüñòâî òîãî, ÷òî ëþáîé àíàëèç çàøèôðîâàííîãî òàêèì îáðàçîì òåêñòà ïî òðóäî¸ìêîñòè áóäåò íå íèæå ïåðåáîðà âñåãî ìíîæåñòâà êëþ÷åé, à òàêæå îöåíêà çàâèñèìîñòè âðåìåíè ïåðåáîðà îò äëèíû êëþ÷à. Êàê óæå óïîìèíàëîñü, äëÿ ãåíåðàöèè ãàììû íåîáõîäèìî âûáðàòü ïðèìèòèâíûé íåïðèâîäèìûé ïîëèíîì ñîîòâåòñòâóþùåé ñòåïåíè.
Ñàìà ïðîãðàììà è èñõîäíûå òåêñòû ïðèëàãàþòñÿ.
Ñïàñèáî çà âíèìàíèå. Âàøå ìíåíèå ?
Çàøèôðîâêà
ôàçà 1 – çàùèòà îò èçìåíåíèé â èñõîäíîì òåêñòå
// ïðÿìîé õîä (3.5)
prev = 0;
äëÿ i îò 1 äî k
{
next = ñèãíàòóðà(prev, ai);
ai = f(prev, ai);
prev = next;
}
// îáðàòíûé õîä (3.6)
prev = 0;
äëÿ i îò k äî 1
{
next = ñèãíàòóðà(prev, ai);
ai = f(prev, ai);
prev = next;
}
ôàçà 2 – çàùèòà îò èçìåíåíèé â çàøèôðîâàííîì òåêñòå
// ïðÿìîé õîä (3.7)
prev = 0;
äëÿ i îò 1 äî k
{
ai = f(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
// îáðàòíûé õîä (3.8)
prev = 0;
äëÿ i îò k äî 1
{
ai = f(prev, ai);
prev = ñèãíàòóðà(prev, ai);
}
Âñå ïóáëèêàöèè ðàçäåëà