mirror of
https://github.com/TheAlgorithms/C-Plus-Plus.git
synced 2026-03-25 14:23:03 +08:00
1017 lines
80 KiB
HTML
1017 lines
80 KiB
HTML
<!-- HTML header for doxygen 1.12.0-->
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
|
<meta name="generator" content="Doxygen 1.14.0"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>TheAlgorithms/C++: ciphers::HillCipher Class Reference</title>
|
|
<link rel="icon" href="../../favicon.svg" type="image/x-icon" />
|
|
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="../../jquery.js"></script>
|
|
<script type="text/javascript" src="../../dynsections.js"></script>
|
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@xpack-3rd-party/doxygen-awesome-css@2.2.0-1/doxygen-awesome-darkmode-toggle.js"></script>
|
|
<script type="text/javascript">
|
|
DoxygenAwesomeDarkModeToggle.init()
|
|
</script>
|
|
<script type="text/javascript" src="../../clipboard.js"></script>
|
|
<link href="../../navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="../../navtreedata.js"></script>
|
|
<script type="text/javascript" src="../../navtree.js"></script>
|
|
<script type="text/javascript" src="../../cookie.js"></script>
|
|
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="../../search/searchdata.js"></script>
|
|
<script type="text/javascript" src="../../search/search.js"></script>
|
|
<script type="text/javascript">
|
|
window.MathJax = {
|
|
options: {
|
|
ignoreHtmlClass: 'tex2jax_ignore',
|
|
processHtmlClass: 'tex2jax_process'
|
|
},
|
|
loader: {
|
|
load: ['[tex]/ams']
|
|
},
|
|
tex: {
|
|
macros: {},
|
|
packages: ['base','configmacros','ams']
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript" id="MathJax-script" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
|
|
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
|
|
<link href="../../doxygen-awesome.css" rel="stylesheet" type="text/css"/>
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr id="projectrow">
|
|
<td id="projectlogo"><img alt="Logo" src="../../project_logo.png"/></td>
|
|
<td id="projectalign">
|
|
<div id="projectname">TheAlgorithms/C++<span id="projectnumber"> 1.0.0</span>
|
|
</div>
|
|
<div id="projectbrief">All the algorithms implemented in C++</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.14.0 -->
|
|
<script type="text/javascript">
|
|
var searchBox = new SearchBox("searchBox", "../../search/",'.html');
|
|
</script>
|
|
<script type="text/javascript">
|
|
$(function() { codefold.init(); });
|
|
</script>
|
|
<script type="text/javascript" src="../../menudata.js"></script>
|
|
<script type="text/javascript" src="../../menu.js"></script>
|
|
<script type="text/javascript">
|
|
$(function() {
|
|
initMenu('../../',true,false,'search.php','Search',true);
|
|
$(function() { init_search(); });
|
|
});
|
|
</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
$(function(){initNavTree('d6/d26/classciphers_1_1_hill_cipher.html','../../','d0/dd5/classciphers_1_1_hill_cipher-members'); });
|
|
</script>
|
|
<div id="container">
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<div id="MSearchResults">
|
|
<div class="SRPage">
|
|
<div id="SRIndex">
|
|
<div id="SRResults"></div>
|
|
<div class="SRStatus" id="Loading">Loading...</div>
|
|
<div class="SRStatus" id="Searching">Searching...</div>
|
|
<div class="SRStatus" id="NoMatches">No Matches</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle"><div class="title">ciphers::HillCipher Class Reference</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
|
|
<p>Implementation of <a href="https://en.wikipedia.org/wiki/Hill_cipher" target="_blank">Hill Cipher</a> algorithm.
|
|
<a href="#details">More...</a></p>
|
|
<table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-pub-static-methods" class="groupheader"><a id="pub-static-methods" name="pub-static-methods"></a>
|
|
Static Public Member Functions</h2></td></tr>
|
|
<tr class="memitem:a642f70fb54cb50b00fb6df7c3f2b120e" id="r_a642f70fb54cb50b00fb6df7c3f2b120e"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > </td><td class="memItemRight" valign="bottom"><a class="el" href="#a642f70fb54cb50b00fb6df7c3f2b120e">generate_encryption_key</a> (size_t size, int limit1=0, int limit2=10)</td></tr>
|
|
<tr class="memdesc:a642f70fb54cb50b00fb6df7c3f2b120e"><td class="mdescLeft"> </td><td class="mdescRight">Generate encryption matrix of a given size. Larger size matrices are difficult to generate but provide more security. Important conditions are: <br /></td></tr>
|
|
<tr class="memitem:ab02c7563889bf1e363deb8e21967b706" id="r_ab02c7563889bf1e363deb8e21967b706"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > </td><td class="memItemRight" valign="bottom"><a class="el" href="#ab02c7563889bf1e363deb8e21967b706">generate_decryption_key</a> (<a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > const &encrypt_key)</td></tr>
|
|
<tr class="memdesc:ab02c7563889bf1e363deb8e21967b706"><td class="mdescLeft"> </td><td class="mdescRight">Generate decryption matrix from an encryption matrix key. <br /></td></tr>
|
|
<tr class="memitem:a405b0a28d66a61239d3565d5256f9cb5" id="r_a405b0a28d66a61239d3565d5256f9cb5"><td class="memItemLeft" align="right" valign="top">static std::pair< <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int >, <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > > </td><td class="memItemRight" valign="bottom"><a class="el" href="#a405b0a28d66a61239d3565d5256f9cb5">generate_keys</a> (size_t size, int limit1=0, int limit2=10)</td></tr>
|
|
<tr class="memdesc:a405b0a28d66a61239d3565d5256f9cb5"><td class="mdescLeft"> </td><td class="mdescRight">Generate encryption and decryption key pair. <br /></td></tr>
|
|
<tr class="memitem:aa8bbb6e4a5749f6008b06602d5103917" id="r_aa8bbb6e4a5749f6008b06602d5103917"><td class="memItemLeft" align="right" valign="top">static const std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="#aa8bbb6e4a5749f6008b06602d5103917">encrypt_text</a> (const std::string &text, const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &encrypt_key)</td></tr>
|
|
<tr class="memdesc:aa8bbb6e4a5749f6008b06602d5103917"><td class="mdescLeft"> </td><td class="mdescRight">Encrypt a given text using a given key. <br /></td></tr>
|
|
<tr class="memitem:a427acfac1dbff3f48a2b071d449d965b" id="r_a427acfac1dbff3f48a2b071d449d965b"><td class="memItemLeft" align="right" valign="top">static const std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="#a427acfac1dbff3f48a2b071d449d965b">decrypt_text</a> (const std::string &text, const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &decrypt_key)</td></tr>
|
|
<tr class="memdesc:a427acfac1dbff3f48a2b071d449d965b"><td class="mdescLeft"> </td><td class="mdescRight">Decrypt a given text using a given key. <br /></td></tr>
|
|
</table><table class="memberdecls">
|
|
<tr class="heading"><td colspan="2"><h2 id="header-pri-static-methods" class="groupheader"><a id="pri-static-methods" name="pri-static-methods"></a>
|
|
Static Private Member Functions</h2></td></tr>
|
|
<tr class="memitem:a629be41c1ab78850963e4ce14e1d11d9" id="r_a629be41c1ab78850963e4ce14e1d11d9"><td class="memTemplParams" colspan="2">template<typename T1, typename T2> </td></tr>
|
|
<tr class="memitem:a629be41c1ab78850963e4ce14e1d11d9 template"><td class="memItemLeft" align="right" valign="top">static const T2 </td><td class="memItemRight" valign="bottom"><a class="el" href="#a629be41c1ab78850963e4ce14e1d11d9">rand_range</a> (T1 a, T1 b)</td></tr>
|
|
<tr class="memdesc:a629be41c1ab78850963e4ce14e1d11d9"><td class="mdescLeft"> </td><td class="mdescRight">Function to generate a random integer in a given interval. <br /></td></tr>
|
|
<tr class="memitem:a716d0313141499d16f57c0c107f04395" id="r_a716d0313141499d16f57c0c107f04395"><td class="memTemplParams" colspan="2">template<typename T1, typename T2> </td></tr>
|
|
<tr class="memitem:a716d0313141499d16f57c0c107f04395 template"><td class="memItemLeft" align="right" valign="top">static double </td><td class="memItemRight" valign="bottom"><a class="el" href="#a716d0313141499d16f57c0c107f04395">rand_range</a> (<a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< T2 > *M, T1 a, T1 b)</td></tr>
|
|
<tr class="memdesc:a716d0313141499d16f57c0c107f04395"><td class="mdescLeft"> </td><td class="mdescRight">Function overload to fill a matrix with random integers in a given interval. <br /></td></tr>
|
|
<tr class="memitem:a7760f3665651a0a37937c79c62f219c0" id="r_a7760f3665651a0a37937c79c62f219c0"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:a7760f3665651a0a37937c79c62f219c0 template"><td class="memItemLeft" align="right" valign="top">static const T </td><td class="memItemRight" valign="bottom"><a class="el" href="#a7760f3665651a0a37937c79c62f219c0">gcd</a> (T a, T b)</td></tr>
|
|
<tr class="memdesc:a7760f3665651a0a37937c79c62f219c0"><td class="mdescLeft"> </td><td class="mdescRight">Compute <a href="https://en.wikipedia.org/wiki/Greatest_common_divisor" target="_blank">GCD</a> of two integers using Euler's algorithm. <br /></td></tr>
|
|
<tr class="memitem:ad36cbcc7a458b3f3a2af0c4aa1126590" id="r_ad36cbcc7a458b3f3a2af0c4aa1126590"><td class="memItemLeft" align="right" valign="top">static const std::valarray< uint8_t > </td><td class="memItemRight" valign="bottom"><a class="el" href="#ad36cbcc7a458b3f3a2af0c4aa1126590">mat_mul</a> (const std::valarray< uint8_t > &<a class="el" href="../../d7/dfc/classvector.html">vector</a>, const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &key)</td></tr>
|
|
<tr class="memdesc:ad36cbcc7a458b3f3a2af0c4aa1126590"><td class="mdescLeft"> </td><td class="mdescRight">helper function to perform vector multiplication with encryption or decryption matrix <br /></td></tr>
|
|
<tr class="memitem:a12f727cca9e21f9539cd74b6603adf0c" id="r_a12f727cca9e21f9539cd74b6603adf0c"><td class="memItemLeft" align="right" valign="top">static char </td><td class="memItemRight" valign="bottom"><a class="el" href="#a12f727cca9e21f9539cd74b6603adf0c">get_idx_char</a> (const uint8_t idx)</td></tr>
|
|
<tr class="memdesc:a12f727cca9e21f9539cd74b6603adf0c"><td class="mdescLeft"> </td><td class="mdescRight">Get the character at a given index in the <a class="el" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>. <br /></td></tr>
|
|
<tr class="memitem:ae77cad522fa44b8c985779a7188d2f41" id="r_ae77cad522fa44b8c985779a7188d2f41"><td class="memItemLeft" align="right" valign="top">static uint8_t </td><td class="memItemRight" valign="bottom"><a class="el" href="#ae77cad522fa44b8c985779a7188d2f41">get_char_idx</a> (const char ch)</td></tr>
|
|
<tr class="memdesc:ae77cad522fa44b8c985779a7188d2f41"><td class="mdescLeft"> </td><td class="mdescRight">Get the index of a character in the <a class="el" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>. <br /></td></tr>
|
|
<tr class="memitem:ad667fa0860977f6d6d443fa1dbcd80aa" id="r_ad667fa0860977f6d6d443fa1dbcd80aa"><td class="memItemLeft" align="right" valign="top">static const std::string </td><td class="memItemRight" valign="bottom"><a class="el" href="#ad667fa0860977f6d6d443fa1dbcd80aa">codec</a> (const std::string &text, const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &key)</td></tr>
|
|
<tr class="memdesc:ad667fa0860977f6d6d443fa1dbcd80aa"><td class="mdescLeft"> </td><td class="mdescRight">Convenience function to perform block cipher operations. The operations are identical for both encryption and decryption. <br /></td></tr>
|
|
<tr class="memitem:a2eb58750b978a93ac5e6eb29e3e570b7" id="r_a2eb58750b978a93ac5e6eb29e3e570b7"><td class="memTemplParams" colspan="2">template<typename T> </td></tr>
|
|
<tr class="memitem:a2eb58750b978a93ac5e6eb29e3e570b7 template"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< double > </td><td class="memItemRight" valign="bottom"><a class="el" href="#a2eb58750b978a93ac5e6eb29e3e570b7">get_inverse</a> (<a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< T > const &A)</td></tr>
|
|
<tr class="memitem:a63e7b8e92dff8b9260d6d21c31ecebd0" id="r_a63e7b8e92dff8b9260d6d21c31ecebd0"><td class="memItemLeft" align="right" valign="top">static int </td><td class="memItemRight" valign="bottom"><a class="el" href="#a63e7b8e92dff8b9260d6d21c31ecebd0">modulo</a> (int a, int b)</td></tr>
|
|
</table>
|
|
<a name="details" id="details"></a><h2 id="header-details" class="groupheader">Detailed Description</h2>
|
|
<div class="textblock"><p>Implementation of <a href="https://en.wikipedia.org/wiki/Hill_cipher" target="_blank">Hill Cipher</a> algorithm. </p>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00082">82</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
</div><a name="doc-func-members" id="doc-func-members"></a><h2 id="header-doc-func-members" class="groupheader">Member Function Documentation</h2>
|
|
<a id="ad667fa0860977f6d6d443fa1dbcd80aa" name="ad667fa0860977f6d6d443fa1dbcd80aa"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ad667fa0860977f6d6d443fa1dbcd80aa">◆ </a></span>codec()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const std::string ciphers::HillCipher::codec </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const std::string &</td> <td class="paramname"><span class="paramname"><em>text</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &</td> <td class="paramname"><span class="paramname"><em>key</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Convenience function to perform block cipher operations. The operations are identical for both encryption and decryption. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">text</td><td>input text to encrypt or decrypt </td></tr>
|
|
<tr><td class="paramname">key</td><td>key for encryption or decryption </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>encrypted/decrypted output </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00211">211</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 212</span> {</div>
|
|
<div class="line"><span class="lineno"> 213</span> <span class="keywordtype">size_t</span> text_len = text.length();</div>
|
|
<div class="line"><span class="lineno"> 214</span> <span class="keywordtype">size_t</span> key_len = key.size();</div>
|
|
<div class="line"><span class="lineno"> 215</span> </div>
|
|
<div class="line"><span class="lineno"> 216</span> <span class="comment">// length of output string must be a multiple of key_len</span></div>
|
|
<div class="line"><span class="lineno"> 217</span> <span class="comment">// create output string and initialize with '\0' character</span></div>
|
|
<div class="line"><span class="lineno"> 218</span> <span class="keywordtype">size_t</span> L2 = text_len % key_len == 0</div>
|
|
<div class="line"><span class="lineno"> 219</span> ? text_len</div>
|
|
<div class="line"><span class="lineno"> 220</span> : text_len + key_len - (text_len % key_len);</div>
|
|
<div class="line"><span class="lineno"> 221</span> std::string coded_text(L2, <span class="charliteral">'\0'</span>);</div>
|
|
<div class="line"><span class="lineno"> 222</span> </div>
|
|
<div class="line"><span class="lineno"> 223</span> <span class="comment">// temporary array for batch processing</span></div>
|
|
<div class="line"><span class="lineno"> 224</span> <span class="keywordtype">int</span> i;</div>
|
|
<div class="line"><span class="lineno"> 225</span><span class="preprocessor">#ifdef _OPENMP</span></div>
|
|
<div class="line"><span class="lineno"> 226</span><span class="preprocessor">#pragma parallel omp for private(i)</span></div>
|
|
<div class="line"><span class="lineno"> 227</span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><span class="lineno"> 228</span> <span class="keywordflow">for</span> (i = 0; i < L2 - key_len + 1; i += key_len) {</div>
|
|
<div class="line"><span class="lineno"> 229</span> std::valarray<uint8_t> batch_int(key_len);</div>
|
|
<div class="line"><span class="lineno"> 230</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < key_len; j++) {</div>
|
|
<div class="line"><span class="lineno"> 231</span> batch_int[j] = <a class="code hl_function" href="#ae77cad522fa44b8c985779a7188d2f41">get_char_idx</a>(text[i + j]);</div>
|
|
<div class="line"><span class="lineno"> 232</span> }</div>
|
|
<div class="line"><span class="lineno"> 233</span> </div>
|
|
<div class="line"><span class="lineno"> 234</span> batch_int = <a class="code hl_function" href="#ad36cbcc7a458b3f3a2af0c4aa1126590">mat_mul</a>(batch_int, key);</div>
|
|
<div class="line"><span class="lineno"> 235</span> </div>
|
|
<div class="line"><span class="lineno"> 236</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < key_len; j++) {</div>
|
|
<div class="line"><span class="lineno"> 237</span> coded_text[i + j] =</div>
|
|
<div class="line"><span class="lineno"> 238</span> <a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>[batch_int[j]]; <span class="comment">// get character at key</span></div>
|
|
<div class="line"><span class="lineno"> 239</span> }</div>
|
|
<div class="line"><span class="lineno"> 240</span> }</div>
|
|
<div class="line"><span class="lineno"> 241</span> </div>
|
|
<div class="line"><span class="lineno"> 242</span> <span class="keywordflow">return</span> coded_text;</div>
|
|
<div class="line"><span class="lineno"> 243</span> }</div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_ad36cbcc7a458b3f3a2af0c4aa1126590"><div class="ttname"><a href="#ad36cbcc7a458b3f3a2af0c4aa1126590">ciphers::HillCipher::mat_mul</a></div><div class="ttdeci">static const std::valarray< uint8_t > mat_mul(const std::valarray< uint8_t > &vector, const matrix< int > &key)</div><div class="ttdoc">helper function to perform vector multiplication with encryption or decryption matrix</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00160">hill_cipher.cpp:160</a></div></div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_ae77cad522fa44b8c985779a7188d2f41"><div class="ttname"><a href="#ae77cad522fa44b8c985779a7188d2f41">ciphers::HillCipher::get_char_idx</a></div><div class="ttdeci">static uint8_t get_char_idx(const char ch)</div><div class="ttdoc">Get the index of a character in the STRKEY.</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00191">hill_cipher.cpp:191</a></div></div>
|
|
<div class="ttc" id="anamespaceciphers_html_ab9aec0ccf4b6809f652bb540be87c216"><div class="ttname"><a href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">ciphers::STRKEY</a></div><div class="ttdeci">static const char * STRKEY</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00074">hill_cipher.cpp:74</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a427acfac1dbff3f48a2b071d449d965b" name="a427acfac1dbff3f48a2b071d449d965b"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a427acfac1dbff3f48a2b071d449d965b">◆ </a></span>decrypt_text()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const std::string ciphers::HillCipher::decrypt_text </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const std::string &</td> <td class="paramname"><span class="paramname"><em>text</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &</td> <td class="paramname"><span class="paramname"><em>decrypt_key</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Decrypt a given text using a given key. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">text</td><td>string to decrypt </td></tr>
|
|
<tr><td class="paramname">decrypt_key</td><td>key for decryption </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>decrypted text </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00457">457</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 458</span> {</div>
|
|
<div class="line"><span class="lineno"> 459</span> <span class="keywordflow">return</span> <a class="code hl_function" href="#ad667fa0860977f6d6d443fa1dbcd80aa">codec</a>(text, decrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 460</span> }</div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_ad667fa0860977f6d6d443fa1dbcd80aa"><div class="ttname"><a href="#ad667fa0860977f6d6d443fa1dbcd80aa">ciphers::HillCipher::codec</a></div><div class="ttdeci">static const std::string codec(const std::string &text, const matrix< int > &key)</div><div class="ttdoc">Convenience function to perform block cipher operations. The operations are identical for both encryp...</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00211">hill_cipher.cpp:211</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="aa8bbb6e4a5749f6008b06602d5103917" name="aa8bbb6e4a5749f6008b06602d5103917"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#aa8bbb6e4a5749f6008b06602d5103917">◆ </a></span>encrypt_text()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const std::string ciphers::HillCipher::encrypt_text </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const std::string &</td> <td class="paramname"><span class="paramname"><em>text</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &</td> <td class="paramname"><span class="paramname"><em>encrypt_key</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Encrypt a given text using a given key. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">text</td><td>string to encrypt </td></tr>
|
|
<tr><td class="paramname">encrypt_key</td><td>key for encryption </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>encrypted text </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00445">445</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 446</span> {</div>
|
|
<div class="line"><span class="lineno"> 447</span> <span class="keywordflow">return</span> <a class="code hl_function" href="#ad667fa0860977f6d6d443fa1dbcd80aa">codec</a>(text, encrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 448</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a7760f3665651a0a37937c79c62f219c0" name="a7760f3665651a0a37937c79c62f219c0"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a7760f3665651a0a37937c79c62f219c0">◆ </a></span>gcd()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const T ciphers::HillCipher::gcd </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T</td> <td class="paramname"><span class="paramname"><em>b</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Compute <a href="https://en.wikipedia.org/wiki/Greatest_common_divisor" target="_blank">GCD</a> of two integers using Euler's algorithm. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">a</td><td>first number </td></tr>
|
|
<tr><td class="paramname">b</td><td>second number </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>GCD of \(a\) and \(b\) </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00139">139</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 139</span> {</div>
|
|
<div class="line"><span class="lineno"> 140</span> <span class="keywordflow">if</span> (b > a) <span class="comment">// ensure always a < b</span></div>
|
|
<div class="line"><span class="lineno"> 141</span> std::swap(a, b);</div>
|
|
<div class="line"><span class="lineno"> 142</span> </div>
|
|
<div class="line"><span class="lineno"> 143</span> <span class="keywordflow">while</span> (b != 0) {</div>
|
|
<div class="line"><span class="lineno"> 144</span> T tmp = b;</div>
|
|
<div class="line"><span class="lineno"> 145</span> b = a % b;</div>
|
|
<div class="line"><span class="lineno"> 146</span> a = tmp;</div>
|
|
<div class="line"><span class="lineno"> 147</span> }</div>
|
|
<div class="line"><span class="lineno"> 148</span> </div>
|
|
<div class="line"><span class="lineno"> 149</span> <span class="keywordflow">return</span> a;</div>
|
|
<div class="line"><span class="lineno"> 150</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="ab02c7563889bf1e363deb8e21967b706" name="ab02c7563889bf1e363deb8e21967b706"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ab02c7563889bf1e363deb8e21967b706">◆ </a></span>generate_decryption_key()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > ciphers::HillCipher::generate_decryption_key </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > const &</td> <td class="paramname"><span class="paramname"><em>encrypt_key</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Generate decryption matrix from an encryption matrix key. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">encrypt_key</td><td>encryption key for which to create a decrypt key </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Decryption martix </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00372">372</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 372</span> {</div>
|
|
<div class="line"><span class="lineno"> 373</span> <span class="keywordtype">size_t</span> size = encrypt_key.size();</div>
|
|
<div class="line"><span class="lineno"> 374</span> <span class="keywordtype">int</span> L = std::strlen(<a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>);</div>
|
|
<div class="line"><span class="lineno"> 375</span> </div>
|
|
<div class="line"><span class="lineno"> 376</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a> decrypt_key(size, std::valarray<int>(size));</div>
|
|
<div class="line"><span class="lineno"> 377</span> <span class="keywordtype">int</span> det_encrypt = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<a class="code hl_function" href="../../d1/dbe/lu__decomposition_8h.html#a3108d43bd32c6fb3b3c158476c51ba7f">determinant_lu</a>(encrypt_key));</div>
|
|
<div class="line"><span class="lineno"> 378</span> </div>
|
|
<div class="line"><span class="lineno"> 379</span> <span class="keywordtype">int</span> mat_determinant = det_encrypt < 0 ? det_encrypt % L : det_encrypt;</div>
|
|
<div class="line"><span class="lineno"> 380</span> </div>
|
|
<div class="line"><span class="lineno"> 381</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<double></a> tmp_inverse = <a class="code hl_function" href="#a2eb58750b978a93ac5e6eb29e3e570b7">get_inverse</a>(encrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 382</span> </div>
|
|
<div class="line"><span class="lineno"> 383</span> <span class="comment">// find co-prime factor for inversion</span></div>
|
|
<div class="line"><span class="lineno"> 384</span> <span class="keywordtype">int</span> det_inv = -1;</div>
|
|
<div class="line"><span class="lineno"> 385</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < L; i++) {</div>
|
|
<div class="line"><span class="lineno"> 386</span> <span class="keywordflow">if</span> (modulo(mat_determinant * i, L) == 1) {</div>
|
|
<div class="line"><span class="lineno"> 387</span> det_inv = i;</div>
|
|
<div class="line"><span class="lineno"> 388</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><span class="lineno"> 389</span> }</div>
|
|
<div class="line"><span class="lineno"> 390</span> }</div>
|
|
<div class="line"><span class="lineno"> 391</span> </div>
|
|
<div class="line"><span class="lineno"> 392</span> <span class="keywordflow">if</span> (det_inv == -1) {</div>
|
|
<div class="line"><span class="lineno"> 393</span> std::cerr << <span class="stringliteral">"Could not find a co-prime for inversion\n"</span>;</div>
|
|
<div class="line"><span class="lineno"> 394</span> std::exit(EXIT_FAILURE);</div>
|
|
<div class="line"><span class="lineno"> 395</span> }</div>
|
|
<div class="line"><span class="lineno"> 396</span> </div>
|
|
<div class="line"><span class="lineno"> 397</span> mat_determinant = det_inv * det_encrypt;</div>
|
|
<div class="line"><span class="lineno"> 398</span> </div>
|
|
<div class="line"><span class="lineno"> 399</span> <span class="comment">// perform modular inverse of encryption matrix</span></div>
|
|
<div class="line"><span class="lineno"> 400</span> <span class="keywordtype">int</span> i;</div>
|
|
<div class="line"><span class="lineno"> 401</span><span class="preprocessor">#ifdef _OPENMP</span></div>
|
|
<div class="line"><span class="lineno"> 402</span><span class="preprocessor">#pragma parallel omp for private(i)</span></div>
|
|
<div class="line"><span class="lineno"> 403</span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><span class="lineno"> 404</span> <span class="keywordflow">for</span> (i = 0; i < size; i++) {</div>
|
|
<div class="line"><span class="lineno"> 405</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < size; j++) {</div>
|
|
<div class="line"><span class="lineno"> 406</span> <span class="keywordtype">int</span> temp = std::round(tmp_inverse[i][j] * mat_determinant);</div>
|
|
<div class="line"><span class="lineno"> 407</span> decrypt_key[i][j] = modulo(temp, L);</div>
|
|
<div class="line"><span class="lineno"> 408</span> }</div>
|
|
<div class="line"><span class="lineno"> 409</span> }</div>
|
|
<div class="line"><span class="lineno"> 410</span> <span class="keywordflow">return</span> decrypt_key;</div>
|
|
<div class="line"><span class="lineno"> 411</span> }</div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_a2eb58750b978a93ac5e6eb29e3e570b7"><div class="ttname"><a href="#a2eb58750b978a93ac5e6eb29e3e570b7">ciphers::HillCipher::get_inverse</a></div><div class="ttdeci">static matrix< double > get_inverse(matrix< T > const &A)</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00251">hill_cipher.cpp:251</a></div></div>
|
|
<div class="ttc" id="alu__decomposition_8h_html_a3108d43bd32c6fb3b3c158476c51ba7f"><div class="ttname"><a href="../../d1/dbe/lu__decomposition_8h.html#a3108d43bd32c6fb3b3c158476c51ba7f">determinant_lu</a></div><div class="ttdeci">double determinant_lu(const matrix< T > &A)</div><div class="ttdef"><b>Definition</b> <a href="../../d1/dbe/lu__decomposition_8h_source.html#l00090">lu_decomposition.h:90</a></div></div>
|
|
<div class="ttc" id="alu__decomposition_8h_html_ac029b636b353cefbb18b2fcc71e427e4"><div class="ttname"><a href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a></div><div class="ttdeci">std::vector< std::valarray< T > > matrix</div><div class="ttdef"><b>Definition</b> <a href="../../d1/dbe/lu__decomposition_8h_source.html#l00019">lu_decomposition.h:19</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a642f70fb54cb50b00fb6df7c3f2b120e" name="a642f70fb54cb50b00fb6df7c3f2b120e"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a642f70fb54cb50b00fb6df7c3f2b120e">◆ </a></span>generate_encryption_key()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > ciphers::HillCipher::generate_encryption_key </td>
|
|
<td>(</td>
|
|
<td class="paramtype">size_t</td> <td class="paramname"><span class="paramname"><em>size</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>limit1</em></span><span class="paramdefsep"> = </span><span class="paramdefval">0</span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>limit2</em></span><span class="paramdefsep"> = </span><span class="paramdefval">10</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Generate encryption matrix of a given size. Larger size matrices are difficult to generate but provide more security. Important conditions are: </p>
|
|
<ol type="1">
|
|
<li>matrix should be invertible</li>
|
|
<li>determinant must not have any common factors with the length of character key There is no head-fast way to generate hte matrix under the given numerical restrictions of the machine but the conditions added achieve the goals. Bigger the matrix, greater is the probability of the matrix being ill-defined.</li>
|
|
</ol>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">size</td><td>size of matrix (typically \(\text{size}\le10\)) </td></tr>
|
|
<tr><td class="paramname">limit1</td><td>lower limit of range of random elements (default=0) </td></tr>
|
|
<tr><td class="paramname">limit2</td><td>upper limit of range of random elements (default=10) </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>Encryption martix </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00340">340</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 341</span> {</div>
|
|
<div class="line"><span class="lineno"> 342</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a> encrypt_key(size, std::valarray<int>(size));</div>
|
|
<div class="line"><span class="lineno"> 343</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a> min_mat = encrypt_key;</div>
|
|
<div class="line"><span class="lineno"> 344</span> <span class="keywordtype">int</span> mat_determinant = -1; <span class="comment">// because matrix has only ints, the</span></div>
|
|
<div class="line"><span class="lineno"> 345</span> <span class="comment">// determinant will also be an int</span></div>
|
|
<div class="line"><span class="lineno"> 346</span> <span class="keywordtype">int</span> L = std::strlen(<a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>);</div>
|
|
<div class="line"><span class="lineno"> 347</span> </div>
|
|
<div class="line"><span class="lineno"> 348</span> <span class="keywordtype">double</span> dd;</div>
|
|
<div class="line"><span class="lineno"> 349</span> <span class="keywordflow">do</span> {</div>
|
|
<div class="line"><span class="lineno"> 350</span> <span class="comment">// keeping the random number range smaller generates better</span></div>
|
|
<div class="line"><span class="lineno"> 351</span> <span class="comment">// defined matrices with more ease of cracking</span></div>
|
|
<div class="line"><span class="lineno"> 352</span> dd = <a class="code hl_function" href="#a629be41c1ab78850963e4ce14e1d11d9">rand_range</a>(&encrypt_key, limit1, limit2);</div>
|
|
<div class="line"><span class="lineno"> 353</span> mat_determinant = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(dd);</div>
|
|
<div class="line"><span class="lineno"> 354</span> </div>
|
|
<div class="line"><span class="lineno"> 355</span> <span class="keywordflow">if</span> (mat_determinant < 0)</div>
|
|
<div class="line"><span class="lineno"> 356</span> mat_determinant = (mat_determinant % L);</div>
|
|
<div class="line"><span class="lineno"> 357</span> } <span class="keywordflow">while</span> (std::abs(dd) > 1e3 || <span class="comment">// while ill-defined</span></div>
|
|
<div class="line"><span class="lineno"> 358</span> dd < 0.1 || <span class="comment">// while singular or negative determinant</span></div>
|
|
<div class="line"><span class="lineno"> 359</span> !std::isfinite(dd) || <span class="comment">// while determinant is not finite</span></div>
|
|
<div class="line"><span class="lineno"> 360</span> <a class="code hl_function" href="#a7760f3665651a0a37937c79c62f219c0">gcd</a>(mat_determinant, L) != 1); <span class="comment">// while no common factors</span></div>
|
|
<div class="line"><span class="lineno"> 361</span> <span class="comment">// std::cout <<</span></div>
|
|
<div class="line"><span class="lineno"> 362</span> </div>
|
|
<div class="line"><span class="lineno"> 363</span> <span class="keywordflow">return</span> encrypt_key;</div>
|
|
<div class="line"><span class="lineno"> 364</span> }</div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_a629be41c1ab78850963e4ce14e1d11d9"><div class="ttname"><a href="#a629be41c1ab78850963e4ce14e1d11d9">ciphers::HillCipher::rand_range</a></div><div class="ttdeci">static const T2 rand_range(T1 a, T1 b)</div><div class="ttdoc">Function to generate a random integer in a given interval.</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00093">hill_cipher.cpp:93</a></div></div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_a7760f3665651a0a37937c79c62f219c0"><div class="ttname"><a href="#a7760f3665651a0a37937c79c62f219c0">ciphers::HillCipher::gcd</a></div><div class="ttdeci">static const T gcd(T a, T b)</div><div class="ttdoc">Compute GCD of two integers using Euler's algorithm.</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00139">hill_cipher.cpp:139</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a405b0a28d66a61239d3565d5256f9cb5" name="a405b0a28d66a61239d3565d5256f9cb5"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a405b0a28d66a61239d3565d5256f9cb5">◆ </a></span>generate_keys()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">std::pair< <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int >, <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > > ciphers::HillCipher::generate_keys </td>
|
|
<td>(</td>
|
|
<td class="paramtype">size_t</td> <td class="paramname"><span class="paramname"><em>size</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>limit1</em></span><span class="paramdefsep"> = </span><span class="paramdefval">0</span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>limit2</em></span><span class="paramdefsep"> = </span><span class="paramdefval">10</span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Generate encryption and decryption key pair. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">size</td><td>size of matrix key (typically \(\text{size}\le10\)) </td></tr>
|
|
<tr><td class="paramname">limit1</td><td>lower limit of range of random elements (default=0) </td></tr>
|
|
<tr><td class="paramname">limit2</td><td>upper limit of range of random elements (default=10) </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>std::pair<<a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a>, <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a>> encryption and decryption keys as a pair</dd></dl>
|
|
<dl class="section see"><dt>See also</dt><dd><a class="el" href="#a642f70fb54cb50b00fb6df7c3f2b120e" title="Generate encryption matrix of a given size. Larger size matrices are difficult to generate but provid...">generate_encryption_key</a> </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00424">424</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 426</span> {</div>
|
|
<div class="line"><span class="lineno"> 427</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a> encrypt_key = <a class="code hl_function" href="#a642f70fb54cb50b00fb6df7c3f2b120e">generate_encryption_key</a>(size);</div>
|
|
<div class="line"><span class="lineno"> 428</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<int></a> decrypt_key = <a class="code hl_function" href="#ab02c7563889bf1e363deb8e21967b706">generate_decryption_key</a>(encrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 429</span> <span class="keywordtype">double</span> det2 = <a class="code hl_function" href="../../d1/dbe/lu__decomposition_8h.html#a3108d43bd32c6fb3b3c158476c51ba7f">determinant_lu</a>(decrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 430</span> <span class="keywordflow">while</span> (std::abs(det2) < 0.1 || std::abs(det2) > 1e3) {</div>
|
|
<div class="line"><span class="lineno"> 431</span> encrypt_key = <a class="code hl_function" href="#a642f70fb54cb50b00fb6df7c3f2b120e">generate_encryption_key</a>(size, limit1, limit2);</div>
|
|
<div class="line"><span class="lineno"> 432</span> decrypt_key = <a class="code hl_function" href="#ab02c7563889bf1e363deb8e21967b706">generate_decryption_key</a>(encrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 433</span> det2 = <a class="code hl_function" href="../../d1/dbe/lu__decomposition_8h.html#a3108d43bd32c6fb3b3c158476c51ba7f">determinant_lu</a>(decrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 434</span> }</div>
|
|
<div class="line"><span class="lineno"> 435</span> <span class="keywordflow">return</span> std::make_pair(encrypt_key, decrypt_key);</div>
|
|
<div class="line"><span class="lineno"> 436</span> }</div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_a642f70fb54cb50b00fb6df7c3f2b120e"><div class="ttname"><a href="#a642f70fb54cb50b00fb6df7c3f2b120e">ciphers::HillCipher::generate_encryption_key</a></div><div class="ttdeci">static matrix< int > generate_encryption_key(size_t size, int limit1=0, int limit2=10)</div><div class="ttdoc">Generate encryption matrix of a given size. Larger size matrices are difficult to generate but provid...</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00340">hill_cipher.cpp:340</a></div></div>
|
|
<div class="ttc" id="aclassciphers_1_1_hill_cipher_html_ab02c7563889bf1e363deb8e21967b706"><div class="ttname"><a href="#ab02c7563889bf1e363deb8e21967b706">ciphers::HillCipher::generate_decryption_key</a></div><div class="ttdeci">static matrix< int > generate_decryption_key(matrix< int > const &encrypt_key)</div><div class="ttdoc">Generate decryption matrix from an encryption matrix key.</div><div class="ttdef"><b>Definition</b> <a href="../../d7/db9/hill__cipher_8cpp_source.html#l00372">hill_cipher.cpp:372</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="ae77cad522fa44b8c985779a7188d2f41" name="ae77cad522fa44b8c985779a7188d2f41"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ae77cad522fa44b8c985779a7188d2f41">◆ </a></span>get_char_idx()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">uint8_t ciphers::HillCipher::get_char_idx </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const char</td> <td class="paramname"><span class="paramname"><em>ch</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Get the index of a character in the <a class="el" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">ch</td><td>character to search </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>index of character </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00191">191</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 191</span> {</div>
|
|
<div class="line"><span class="lineno"> 192</span> <span class="keywordtype">size_t</span> L = std::strlen(<a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>);</div>
|
|
<div class="line"><span class="lineno"> 193</span> </div>
|
|
<div class="line"><span class="lineno"> 194</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> idx = 0; idx <= L; idx++)</div>
|
|
<div class="line"><span class="lineno"> 195</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>[idx] == ch)</div>
|
|
<div class="line"><span class="lineno"> 196</span> <span class="keywordflow">return</span> idx;</div>
|
|
<div class="line"><span class="lineno"> 197</span> </div>
|
|
<div class="line"><span class="lineno"> 198</span> std::cerr << __func__ << <span class="stringliteral">":"</span> << __LINE__ << <span class="stringliteral">": ("</span> << ch</div>
|
|
<div class="line"><span class="lineno"> 199</span> << <span class="stringliteral">") Should not reach here!\n"</span>;</div>
|
|
<div class="line"><span class="lineno"> 200</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><span class="lineno"> 201</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a12f727cca9e21f9539cd74b6603adf0c" name="a12f727cca9e21f9539cd74b6603adf0c"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a12f727cca9e21f9539cd74b6603adf0c">◆ </a></span>get_idx_char()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">char ciphers::HillCipher::get_idx_char </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const uint8_t</td> <td class="paramname"><span class="paramname"><em>idx</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Get the character at a given index in the <a class="el" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">idx</td><td>index value </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>character at the index </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00183">183</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 183</span>{ <span class="keywordflow">return</span> <a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>[idx]; }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a2eb58750b978a93ac5e6eb29e3e570b7" name="a2eb58750b978a93ac5e6eb29e3e570b7"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a2eb58750b978a93ac5e6eb29e3e570b7">◆ </a></span>get_inverse()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T> </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< double > ciphers::HillCipher::get_inverse </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< T > const &</td> <td class="paramname"><span class="paramname"><em>A</em></span></td><td>)</td>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
<p>Get matrix inverse using Row-transformations. Given matrix must be a square and non-singular. </p><dl class="section return"><dt>Returns</dt><dd>inverse matrix </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00251">251</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 251</span> {</div>
|
|
<div class="line"><span class="lineno"> 252</span> <span class="comment">// Assuming A is square matrix</span></div>
|
|
<div class="line"><span class="lineno"> 253</span> <span class="keywordtype">size_t</span> <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a> = A.size();</div>
|
|
<div class="line"><span class="lineno"> 254</span> </div>
|
|
<div class="line"><span class="lineno"> 255</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<double></a> inverse(N, std::valarray<double>(N));</div>
|
|
<div class="line"><span class="lineno"> 256</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row = 0; row < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; row++) {</div>
|
|
<div class="line"><span class="lineno"> 257</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> col = 0; col < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; col++) {</div>
|
|
<div class="line"><span class="lineno"> 258</span> <span class="comment">// create identity matrix</span></div>
|
|
<div class="line"><span class="lineno"> 259</span> inverse[row][col] = (row == col) ? 1.f : 0.f;</div>
|
|
<div class="line"><span class="lineno"> 260</span> }</div>
|
|
<div class="line"><span class="lineno"> 261</span> }</div>
|
|
<div class="line"><span class="lineno"> 262</span> </div>
|
|
<div class="line"><span class="lineno"> 263</span> <span class="keywordflow">if</span> (A.size() != A[0].size()) {</div>
|
|
<div class="line"><span class="lineno"> 264</span> std::cerr << <span class="stringliteral">"A must be a square matrix!"</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 265</span> <span class="keywordflow">return</span> inverse;</div>
|
|
<div class="line"><span class="lineno"> 266</span> }</div>
|
|
<div class="line"><span class="lineno"> 267</span> </div>
|
|
<div class="line"><span class="lineno"> 268</span> <span class="comment">// preallocate a temporary matrix identical to A</span></div>
|
|
<div class="line"><span class="lineno"> 269</span> <a class="code hl_typedef" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix<double></a> temp(N, std::valarray<double>(N));</div>
|
|
<div class="line"><span class="lineno"> 270</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row = 0; row < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; row++) {</div>
|
|
<div class="line"><span class="lineno"> 271</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> col = 0; col < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; col++)</div>
|
|
<div class="line"><span class="lineno"> 272</span> temp[row][col] = <span class="keyword">static_cast<</span><span class="keywordtype">double</span><span class="keyword">></span>(A[row][col]);</div>
|
|
<div class="line"><span class="lineno"> 273</span> }</div>
|
|
<div class="line"><span class="lineno"> 274</span> </div>
|
|
<div class="line"><span class="lineno"> 275</span> <span class="comment">// start transformations</span></div>
|
|
<div class="line"><span class="lineno"> 276</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row = 0; row < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; row++) {</div>
|
|
<div class="line"><span class="lineno"> 277</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row2 = row; row2 < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a> && temp[row][row] == 0; row2++) {</div>
|
|
<div class="line"><span class="lineno"> 278</span> <span class="comment">// this to ensure diagonal elements are not 0</span></div>
|
|
<div class="line"><span class="lineno"> 279</span> temp[row] = temp[row] + temp[row2];</div>
|
|
<div class="line"><span class="lineno"> 280</span> inverse[row] = inverse[row] + inverse[row2];</div>
|
|
<div class="line"><span class="lineno"> 281</span> }</div>
|
|
<div class="line"><span class="lineno"> 282</span> </div>
|
|
<div class="line"><span class="lineno"> 283</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> col2 = row; col2 < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a> && temp[row][row] == 0; col2++) {</div>
|
|
<div class="line"><span class="lineno"> 284</span> <span class="comment">// this to further ensure diagonal elements are not 0</span></div>
|
|
<div class="line"><span class="lineno"> 285</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row2 = 0; row2 < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; row2++) {</div>
|
|
<div class="line"><span class="lineno"> 286</span> temp[row2][row] = temp[row2][row] + temp[row2][col2];</div>
|
|
<div class="line"><span class="lineno"> 287</span> inverse[row2][row] =</div>
|
|
<div class="line"><span class="lineno"> 288</span> inverse[row2][row] + inverse[row2][col2];</div>
|
|
<div class="line"><span class="lineno"> 289</span> }</div>
|
|
<div class="line"><span class="lineno"> 290</span> }</div>
|
|
<div class="line"><span class="lineno"> 291</span> </div>
|
|
<div class="line"><span class="lineno"> 292</span> <span class="keywordflow">if</span> (temp[row][row] == 0) {</div>
|
|
<div class="line"><span class="lineno"> 293</span> <span class="comment">// Probably a low-rank matrix and hence singular</span></div>
|
|
<div class="line"><span class="lineno"> 294</span> std::cerr << <span class="stringliteral">"Low-rank matrix, no inverse!"</span> << std::endl;</div>
|
|
<div class="line"><span class="lineno"> 295</span> <span class="keywordflow">return</span> inverse;</div>
|
|
<div class="line"><span class="lineno"> 296</span> }</div>
|
|
<div class="line"><span class="lineno"> 297</span> </div>
|
|
<div class="line"><span class="lineno"> 298</span> <span class="comment">// set diagonal to 1</span></div>
|
|
<div class="line"><span class="lineno"> 299</span> <span class="keywordtype">double</span> divisor = temp[row][row];</div>
|
|
<div class="line"><span class="lineno"> 300</span> temp[row] = temp[row] / divisor;</div>
|
|
<div class="line"><span class="lineno"> 301</span> inverse[row] = inverse[row] / divisor;</div>
|
|
<div class="line"><span class="lineno"> 302</span> <span class="comment">// Row transformations</span></div>
|
|
<div class="line"><span class="lineno"> 303</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> row2 = 0; row2 < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">N</a>; row2++) {</div>
|
|
<div class="line"><span class="lineno"> 304</span> <span class="keywordflow">if</span> (row2 == row)</div>
|
|
<div class="line"><span class="lineno"> 305</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><span class="lineno"> 306</span> <span class="keywordtype">double</span> factor = temp[row2][row];</div>
|
|
<div class="line"><span class="lineno"> 307</span> temp[row2] = temp[row2] - factor * temp[row];</div>
|
|
<div class="line"><span class="lineno"> 308</span> inverse[row2] = inverse[row2] - factor * inverse[row];</div>
|
|
<div class="line"><span class="lineno"> 309</span> }</div>
|
|
<div class="line"><span class="lineno"> 310</span> }</div>
|
|
<div class="line"><span class="lineno"> 311</span> </div>
|
|
<div class="line"><span class="lineno"> 312</span> <span class="keywordflow">return</span> inverse;</div>
|
|
<div class="line"><span class="lineno"> 313</span> }</div>
|
|
<div class="ttc" id="asparse__table_8cpp_html_a10f3ffb3f6f7e1b83d556b9c8de89a5d"><div class="ttname"><a href="../../d8/dab/sparse__table_8cpp.html#a10f3ffb3f6f7e1b83d556b9c8de89a5d">data_structures::sparse_table::N</a></div><div class="ttdeci">constexpr uint32_t N</div><div class="ttdoc">A struct to represent sparse table for min() as their invariant function, for the given array A....</div><div class="ttdef"><b>Definition</b> <a href="../../d8/dab/sparse__table_8cpp_source.html#l00048">sparse_table.cpp:48</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="ad36cbcc7a458b3f3a2af0c4aa1126590" name="ad36cbcc7a458b3f3a2af0c4aa1126590"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#ad36cbcc7a458b3f3a2af0c4aa1126590">◆ </a></span>mat_mul()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const std::valarray< uint8_t > ciphers::HillCipher::mat_mul </td>
|
|
<td>(</td>
|
|
<td class="paramtype">const std::valarray< uint8_t > &</td> <td class="paramname"><span class="paramname"><em>vector</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">const <a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< int > &</td> <td class="paramname"><span class="paramname"><em>key</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>helper function to perform vector multiplication with encryption or decryption matrix </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">vector</td><td>vector to multiply </td></tr>
|
|
<tr><td class="paramname">key</td><td>encryption or decryption key matrix </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>corresponding encrypted or decrypted text </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00160">160</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 161</span> {</div>
|
|
<div class="line"><span class="lineno"> 162</span> std::valarray<uint8_t> out(vector); <span class="comment">// make a copy</span></div>
|
|
<div class="line"><span class="lineno"> 163</span> </div>
|
|
<div class="line"><span class="lineno"> 164</span> <span class="keywordtype">size_t</span> L = std::strlen(<a class="code hl_variable" href="../../d6/d4e/namespaceciphers.html#ab9aec0ccf4b6809f652bb540be87c216">STRKEY</a>);</div>
|
|
<div class="line"><span class="lineno"> 165</span> </div>
|
|
<div class="line"><span class="lineno"> 166</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < key.size(); i++) {</div>
|
|
<div class="line"><span class="lineno"> 167</span> <span class="keywordtype">int</span> tmp = 0;</div>
|
|
<div class="line"><span class="lineno"> 168</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < vector.size(); j++) {</div>
|
|
<div class="line"><span class="lineno"> 169</span> tmp += key[i][j] * vector[j];</div>
|
|
<div class="line"><span class="lineno"> 170</span> }</div>
|
|
<div class="line"><span class="lineno"> 171</span> out[i] = <span class="keyword">static_cast<</span>uint8_t<span class="keyword">></span>(tmp % L);</div>
|
|
<div class="line"><span class="lineno"> 172</span> }</div>
|
|
<div class="line"><span class="lineno"> 173</span> </div>
|
|
<div class="line"><span class="lineno"> 174</span> <span class="keywordflow">return</span> out;</div>
|
|
<div class="line"><span class="lineno"> 175</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a63e7b8e92dff8b9260d6d21c31ecebd0" name="a63e7b8e92dff8b9260d6d21c31ecebd0"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a63e7b8e92dff8b9260d6d21c31ecebd0">◆ </a></span>modulo()</h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">int ciphers::HillCipher::modulo </td>
|
|
<td>(</td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">int</td> <td class="paramname"><span class="paramname"><em>b</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00315">315</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 315</span> {</div>
|
|
<div class="line"><span class="lineno"> 316</span> <span class="keywordtype">int</span> ret = a % b;</div>
|
|
<div class="line"><span class="lineno"> 317</span> <span class="keywordflow">if</span> (ret < 0)</div>
|
|
<div class="line"><span class="lineno"> 318</span> ret += b;</div>
|
|
<div class="line"><span class="lineno"> 319</span> <span class="keywordflow">return</span> ret;</div>
|
|
<div class="line"><span class="lineno"> 320</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a716d0313141499d16f57c0c107f04395" name="a716d0313141499d16f57c0c107f04395"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a716d0313141499d16f57c0c107f04395">◆ </a></span>rand_range() <span class="overload">[1/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T1, typename T2> </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">double ciphers::HillCipher::rand_range </td>
|
|
<td>(</td>
|
|
<td class="paramtype"><a class="el" href="../../d1/dbe/lu__decomposition_8h.html#ac029b636b353cefbb18b2fcc71e427e4">matrix</a>< T2 > *</td> <td class="paramname"><span class="paramname"><em>M</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T1</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T1</td> <td class="paramname"><span class="paramname"><em>b</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Function overload to fill a matrix with random integers in a given interval. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">M</td><td>pointer to matrix to be filled with random numbers </td></tr>
|
|
<tr><td class="paramname">a</td><td>lower limit of interval </td></tr>
|
|
<tr><td class="paramname">b</td><td>upper limit of interval </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="tparams"><dt>Template Parameters</dt><dd>
|
|
<table class="tparams">
|
|
<tr><td class="paramname">T1</td><td>type of input range </td></tr>
|
|
<tr><td class="paramname">T2</td><td>type of matrix </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>determinant of generated random matrix</dd></dl>
|
|
<dl class="section warning"><dt>Warning</dt><dd>There will need to be a balance between the matrix size and the range of random numbers. If the matrix is large, the range of random numbers must be small to have a well defined keys. Or if the matrix is smaller, the random numbers range can be larger. For an 8x8 matrix, range should be no more than \([0,10]\) </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00119">119</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 119</span> {</div>
|
|
<div class="line"><span class="lineno"> 120</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#af7db62f21983565c64d5d42d2a49888e">M</a>->size(); i++) {</div>
|
|
<div class="line"><span class="lineno"> 121</span> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j < <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#af7db62f21983565c64d5d42d2a49888e">M</a>[0][0].size(); j++) {</div>
|
|
<div class="line"><span class="lineno"> 122</span> <a class="code hl_variable" href="../../d8/dab/sparse__table_8cpp.html#af7db62f21983565c64d5d42d2a49888e">M</a>[0][i][j] = <a class="code hl_function" href="#a629be41c1ab78850963e4ce14e1d11d9">rand_range<T1, T2></a>(a, b);</div>
|
|
<div class="line"><span class="lineno"> 123</span> }</div>
|
|
<div class="line"><span class="lineno"> 124</span> }</div>
|
|
<div class="line"><span class="lineno"> 125</span> </div>
|
|
<div class="line"><span class="lineno"> 126</span> <span class="keywordflow">return</span> <a class="code hl_function" href="../../d1/dbe/lu__decomposition_8h.html#a3108d43bd32c6fb3b3c158476c51ba7f">determinant_lu</a>(*M);</div>
|
|
<div class="line"><span class="lineno"> 127</span> }</div>
|
|
<div class="ttc" id="asparse__table_8cpp_html_af7db62f21983565c64d5d42d2a49888e"><div class="ttname"><a href="../../d8/dab/sparse__table_8cpp.html#af7db62f21983565c64d5d42d2a49888e">data_structures::sparse_table::M</a></div><div class="ttdeci">constexpr uint8_t M</div><div class="ttdoc">ceil(log2(N)).</div><div class="ttdef"><b>Definition</b> <a href="../../d8/dab/sparse__table_8cpp_source.html#l00049">sparse_table.cpp:49</a></div></div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<a id="a629be41c1ab78850963e4ce14e1d11d9" name="a629be41c1ab78850963e4ce14e1d11d9"></a>
|
|
<h2 class="memtitle"><span class="permalink"><a href="#a629be41c1ab78850963e4ce14e1d11d9">◆ </a></span>rand_range() <span class="overload">[2/2]</span></h2>
|
|
|
|
<div class="memitem">
|
|
<div class="memproto">
|
|
<div class="memtemplate">
|
|
template<typename T1, typename T2> </div>
|
|
<table class="mlabels">
|
|
<tr>
|
|
<td class="mlabels-left">
|
|
<table class="memname">
|
|
<tr>
|
|
<td class="memname">const T2 ciphers::HillCipher::rand_range </td>
|
|
<td>(</td>
|
|
<td class="paramtype">T1</td> <td class="paramname"><span class="paramname"><em>a</em></span>, </td>
|
|
</tr>
|
|
<tr>
|
|
<td class="paramkey"></td>
|
|
<td></td>
|
|
<td class="paramtype">T1</td> <td class="paramname"><span class="paramname"><em>b</em></span> )</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td class="mlabels-right">
|
|
<span class="mlabels"><span class="mlabel inline">inline</span><span class="mlabel static">static</span><span class="mlabel private">private</span></span> </td>
|
|
</tr>
|
|
</table>
|
|
</div><div class="memdoc">
|
|
|
|
<p>Function to generate a random integer in a given interval. </p>
|
|
<dl class="params"><dt>Parameters</dt><dd>
|
|
<table class="params">
|
|
<tr><td class="paramname">a</td><td>lower limit of interval </td></tr>
|
|
<tr><td class="paramname">b</td><td>upper limit of interval </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="tparams"><dt>Template Parameters</dt><dd>
|
|
<table class="tparams">
|
|
<tr><td class="paramname">T</td><td>type of output </td></tr>
|
|
</table>
|
|
</dd>
|
|
</dl>
|
|
<dl class="section return"><dt>Returns</dt><dd>random integer in the interval \([a,b)\) </dd></dl>
|
|
|
|
<p class="definition">Definition at line <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html#l00093">93</a> of file <a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a>.</p>
|
|
<div class="fragment"><div class="line"><span class="lineno"> 93</span> {</div>
|
|
<div class="line"><span class="lineno"> 94</span> <span class="comment">// generate random number between 0 and 1</span></div>
|
|
<div class="line"><span class="lineno"> 95</span> <span class="keywordtype">long</span> <span class="keywordtype">double</span> r = <span class="keyword">static_cast<</span><span class="keywordtype">long</span> <span class="keywordtype">double</span><span class="keyword">></span>(std::rand()) / RAND_MAX;</div>
|
|
<div class="line"><span class="lineno"> 96</span> </div>
|
|
<div class="line"><span class="lineno"> 97</span> <span class="comment">// scale and return random number as integer</span></div>
|
|
<div class="line"><span class="lineno"> 98</span> <span class="keywordflow">return</span> <span class="keyword">static_cast<</span>T2<span class="keyword">></span>(r * (b - a) + a);</div>
|
|
<div class="line"><span class="lineno"> 99</span> }</div>
|
|
</div><!-- fragment -->
|
|
</div>
|
|
</div>
|
|
<hr/>The documentation for this class was generated from the following file:<ul>
|
|
<li>ciphers/<a class="el" href="../../d7/db9/hill__cipher_8cpp_source.html">hill_cipher.cpp</a></li>
|
|
</ul>
|
|
</div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<div id="page-nav" class="page-nav-panel">
|
|
<div id="page-nav-resize-handle"></div>
|
|
<div id="page-nav-tree">
|
|
<div id="page-nav-contents">
|
|
</div><!-- page-nav-contents -->
|
|
</div><!-- page-nav-tree -->
|
|
</div><!-- page-nav -->
|
|
</div><!-- container -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a href="../../d6/d4e/namespaceciphers.html">ciphers</a></li><li class="navelem"><a href="../../d6/d26/classciphers_1_1_hill_cipher.html">HillCipher</a></li>
|
|
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="../../doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.14.0 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|