⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gf2n_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: gf2n.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>gf2n.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// gf2n.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "<a class="code" href="gf2n_8h.html">gf2n.h</a>"</span>00008 <span class="preprocessor">#include "algebra.h"</span>00009 <span class="preprocessor">#include "words.h"</span>00010 <span class="preprocessor">#include "randpool.h"</span>00011 <span class="preprocessor">#include "asn.h"</span>00012 <span class="preprocessor">#include "oids.h"</span>00013 00014 <span class="preprocessor">#include &lt;iostream&gt;</span>00015 00016 NAMESPACE_BEGIN(CryptoPP)00017 <a name="l00018"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">00018</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>()00019 {00020 }00021 <a name="l00022"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_2">00022</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>(word value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength)00023         : reg(BitsToWords(bitLength))00024 {00025         assert(value==0 || reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()&gt;0);00026 00027         <span class="keywordflow">if</span> (reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() &gt; 0)00028         {00029                 reg[0] = value;00030                 SetWords(reg+1, 0, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1);00031         }00032 }00033 <a name="l00034"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_1">00034</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>&amp; t)00035         : reg(t.reg.size())00036 {00037         CopyWords(reg, t.reg, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00038 }00039 00040 <span class="keywordtype">void</span> PolynomialMod2::Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbits)00041 {00042         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbytes = nbits/8 + 1;00043         <a class="code" href="class_sec_block.html">SecByteBlock</a> buf(nbytes);00044         rng.<a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(buf, nbytes);00045         buf[0] = (byte)Crop(buf[0], nbits % 8);00046         Decode(buf, nbytes);00047 }00048 00049 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_9">PolynomialMod2::AllOnes</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength)00050 {00051         <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, bitLength);00052         SetWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, ~(word)0, result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00053         <span class="keywordflow">if</span> (bitLength%WORD_BITS)00054                 result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1] = (word)Crop(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1], bitLength%WORD_BITS);00055         <span class="keywordflow">return</span> result;00056 }00057 00058 <span class="keywordtype">void</span> PolynomialMod2::SetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keywordtype">int</span> value)00059 {00060         <span class="keywordflow">if</span> (value)00061         {00062                 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta22">CleanGrow</a>(n/WORD_BITS + 1);00063                 reg[n/WORD_BITS] |= (word(1) &lt;&lt; (n%WORD_BITS));00064         }00065         <span class="keywordflow">else</span>00066         {00067                 <span class="keywordflow">if</span> (n/WORD_BITS &lt; reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00068                         reg[n/WORD_BITS] &amp;= ~(word(1) &lt;&lt; (n%WORD_BITS));00069         }00070 }00071 <a name="l00072"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">00072</a> byte <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">PolynomialMod2::GetByte</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const</span>00073 <span class="keyword"></span>{00074         <span class="keywordflow">if</span> (n/WORD_SIZE &gt;= reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00075                 <span class="keywordflow">return</span> 0;00076         <span class="keywordflow">else</span>00077                 <span class="keywordflow">return</span> byte(reg[n/WORD_SIZE] &gt;&gt; ((n%WORD_SIZE)*8));00078 }00079 <a name="l00080"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_12">00080</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_12">PolynomialMod2::SetByte</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, byte value)00081 {00082         reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta22">CleanGrow</a>(BytesToWords(n+1));00083         reg[n/WORD_SIZE] &amp;= ~(word(0xff) &lt;&lt; 8*(n%WORD_SIZE));00084         reg[n/WORD_SIZE] |= (word(value) &lt;&lt; 8*(n%WORD_SIZE));00085 }00086 <a name="l00087"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_6">00087</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_6">PolynomialMod2::Monomial</a>(<span class="keywordtype">unsigned</span> i) 00088 {00089         <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, i+1); 00090         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(i); 00091         <span class="keywordflow">return</span> r;00092 }00093 <a name="l00094"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_7">00094</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_7">PolynomialMod2::Trinomial</a>(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2) 00095 {00096         <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, t0+1);00097         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t0);00098         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t1);00099         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t2);00100         <span class="keywordflow">return</span> r;00101 }00102 <a name="l00103"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_8">00103</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_8">PolynomialMod2::Pentanomial</a>(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4)00104 {00105         <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, t0+1);00106         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t0);00107         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t1);00108         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t2);00109         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t3);00110         r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t4);00111         <span class="keywordflow">return</span> r;00112 }00113 00114 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;PolynomialMod2::Zero()00115 {00116         <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> zero;00117         <span class="keywordflow">return</span> zero;00118 }00119 00120 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;PolynomialMod2::One()00121 {00122         <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> one = 1;00123         <span class="keywordflow">return</span> one;00124 }00125 00126 <span class="keywordtype">void</span> PolynomialMod2::Decode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen)00127 {00128         <a class="code" href="class_string_store.html">StringStore</a> store(input, inputLen);00129         Decode(store, inputLen);00130 }00131 <a name="l00132"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">00132</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">PolynomialMod2::Encode</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen)<span class="keyword"> const</span>00133 <span class="keyword"></span>{00134         <a class="code" href="class_array_sink.html">ArraySink</a> sink(output, outputLen);00135         <span class="keywordflow">return</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">Encode</a>(sink, outputLen);00136 }00137 00138 <span class="keywordtype">void</span> PolynomialMod2::Decode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen)00139 {00140         reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta20">CleanNew</a>(BytesToWords(inputLen));00141 00142         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=inputLen; i &gt; 0; i--)00143         {00144                 byte b;00145                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b);00146                 reg[(i-1)/WORD_SIZE] |= b &lt;&lt; ((i-1)%WORD_SIZE)*8;00147         }00148 }00149 00150 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">PolynomialMod2::Encode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen)<span class="keyword"> const</span>00151 <span class="keyword"></span>{00152         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=outputLen; i &gt; 0; i--)00153                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">GetByte</a>(i-1));00154         <span class="keywordflow">return</span> outputLen;00155 }00156 <a name="l00157"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_5">00157</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_5">PolynomialMod2::DEREncodeAsOctetString</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)<span class="keyword"> const</span>00158 <span class="keyword"></span>{00159         <a class="code" href="class_d_e_r_general_encoder.html">DERGeneralEncoder</a> enc(bt, OCTET_STRING);00160         <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">Encode</a>(enc, length);00161         enc.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00162 }00163 <a name="l00164"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_6">00164</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_6">PolynomialMod2::BERDecodeAsOctetString</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00165 {00166         <a class="code" href="class_b_e_r_general_decoder.html">BERGeneralDecoder</a> dec(bt, OCTET_STRING);00167         <span class="keywordflow">if</span> (!dec.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera2">IsDefiniteLength</a>() || dec.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera3">RemainingLength</a>() != length)00168                 BERDecodeError();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -