
рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП B Councilycastle рдлреНрд░реЗрдорд╡рд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдпрд╛ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрдиред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рдХреЛрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрд╕рдХреА рд╕рд╣рдирд╢реАрд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░рд┐рдкреНрдЯреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдзрд╛рд░рдгрд╛ рдкрдХреНрдХреА рд╣реИред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдореИрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╕рдордорд┐рдд рдПрдИрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди / рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░рд┐рдкреНрдЯреЛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдУрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреНрдпрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░рдиреЗ рдФрд░ рдПрдИрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░рд┐рдкреНрдЯреЛ ++ рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрдгреНрдбрд╛рдХрд╛рд░ рдХрд░реНрд╡реНрд╕ рдкрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (!)ред рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдХрдИ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрд╕рдПрд╕рдИ рдХреЛ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдирд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред
Android рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд╛рдЗрдЯ рд╕реЗ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдЧреНрд░рд╣рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред рдФрд░ рдХрджрдо:
- рджреЗрд╢реА рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рд▓рд┐рдЦреЗрдВред
- рджреЗрд╢реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рд╡рд╛рд▓рд╛ рдПрдХ рд╕реНрдерд┐рд░ рдмреНрд▓реЙрдХ рдЬреЛрдбрд╝реЗрдВред рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд╣реМрд▓ рдПрдХ * .class рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред
- рдЬрд╛рд╡рд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХред * рдлрд╝рд╛рдЗрд▓ рдХреЛ * .class рдлрд╝рд╛рдЗрд▓ рд╕реЗ C рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде * .h рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
- рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦреЗрдВред
- рд╕рд┐рд╕реНрдЯрдо рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдФрд░ рдореВрд▓ рдХреЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдЯрдм рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд┐рдЦреЗрдВ рдЬреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рдореВрд▓ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред
рдкреНрд░рдмрдВрдзрд┐рдд рд╕реНрдЯрдм рдлрд╝рдВрдХреНрд╢рдВрд╕public class AES { public static int KEY_SIZE = 16; public static int IV_SIZE = 16; static public class CBC { private byte[] __key; private byte[] __iv; public CBC(byte[] key, byte[] iv) { __key = key; __iv = iv; } public CBC() { __key = GenerateKey(); __iv = GenerateIV(); } public native byte[] Encrypt(byte[] data); public native byte[] Decrypt(byte[] data); public byte[] GetKey() { return __key; } public byte[] GetIV() { return __iv; } } public static native byte[] GenerateIV(); public static native byte[] GenerateKey(); static { try { System.loadLibrary("nativecryptowrapper"); } catch (Exception e) { e.printStackTrace(); } } }
рдореВрд▓ рдХреЛрдб рдХреЛ рдЗрдирд╡реЙрдЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдм рдХреЗ рддрд░реАрдХреЗ
native
рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд┐рдпрдорд┐рдд рд╡рд┐рдзрд┐ рдШреЛрд╖рдгрд╛рдПрдВ рд╣реИрдВред
рдХреНрд▓рд╛рд╕
System.loadLibrary
рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдЬреЛ рд╕реНрдЯреИрдЯрд┐рдХ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ
System.loadLibrary
try-catch
рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП
System.loadLibrary
рдХреЙрд▓ рдХреЗ
System.loadLibrary
рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐
loadLibrary
рд╡рд┐рдзрд┐ рдХрд╛ рддрд░реНрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд╛рдо рд╣реИ, рдЬреЛ рдмрд┐рдирд╛ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╣реИ!
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди / рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдЖрдВрддрд░рд┐рдХ-рд╡рд░реНрдЧ рдореЗрдВ рдЪрд▓реЗ рдЧрдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реАрдмреАрд╕реА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдиреЗ рдЗрд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЖрдк рдЪрд░рдг 3 (рдореВрд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдмрдирд╛) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдИрдПрд╕ рд╡рд░реНрдЧ рдореЗрдВ 2 рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╣рдг рд╕реНрд░реЛрдд рдХреЛ рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ * .h рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреАред
рдореВрд▓ рднрд╛рдЧ рдХрд╛ рд╡рд┐рдХрд╛рд╕
рдореВрд▓ рднрд╛рдЧ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА - рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд▓ рд╕реНрдЯреЗрдЯрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рд╕реЗ% PRJ% / jni / cryptopp рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдПрдХ рджреЗрд╢реА рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░рдВрд╕реА рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рдЬреЗрдиреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд┐рдЫрд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╕реНрд░реЛрдд% PRJ% / jni / nativecryptowrapper рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВред
рдореВрд▓ рднрд╛рдЧ рдХреА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдЧреНрд░рд╣рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЬреЗрдиреА рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░
%PRJ%/bin/%NativePrjName%
рдЕрдм рд╣рдо рдЬреЗрдиреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЙрдкрдпреБрдХреНрдд рд╣реЗрдбрд░ (* .h рдлрд╛рдЗрд▓реЗрдВ) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ
%PRJ%/jni/nativecryptowrapper
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ
javah тАУclasspath ../../bin/classes com.cryptodroid.AES
рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА
javah тАУclasspath ../../bin/classes com.cryptodroid.AES
ред
-classpath
рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рд╡рд░реНрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред
%PRJ%/bin/classes
рдХреНрд▓рд╛рд╕ рдлрд╛рдЗрд▓реНрд╕ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╡реЗ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ; рдЗрд╕рд▓рд┐рдП, рдХреНрд▓рд╛рд╕ рдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреЛрдЧреНрдп рд╡рд░реНрдЧ рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП * .h рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред
рдЕрдм рдпрд╣ рд╣реЗрдбрд░ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ nativecryptowrapper / anes_base.cpp рдФрд░ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЬреЗрдиреА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди JNIEXPORT jbyteArray JNICALL Java_com_cryptodroid_crypto_AES_00024CBC_Encrypt(JNIEnv* env, jobject obj, jbyteArray source) { try { std::vector<jbyte> key = to_vector(env, get_field_value<jbyteArray>(env, obj, "__key")); std::vector<jbyte> iv = to_vector(env, get_field_value<jbyteArray>(env, obj, "__iv" )); CryptoPP::CBC_Mode< CryptoPP::AES >::Encryption e; e.SetKeyWithIV( reinterpret_cast<byte*>(&key.front()), KEY_SIZE, reinterpret_cast<byte*>(&iv.front()) ); CryptoPP::StreamTransformationFilter filter (e); jbytearray_holder data_holder(source, env); filter.Put(reinterpret_cast<byte*>(&*data_holder.begin()), data_holder.size()); filter.MessageEnd(); jbyteArray result = env->NewByteArray(filter.MaxRetrievable()); if (!result) throw std::runtime_error("No memory!"); jbytearray_holder result_holder(result, env); filter.Get(reinterpret_cast<byte*>(&*result_holder.begin()), result_holder.size()); return result; } catch (std::exception& e) { throw_jni_exception(env, e); } return NULL; } JNIEXPORT jbyteArray JNICALL Java_com_cryptodroid_crypto_AES_00024CBC_Decrypt(JNIEnv* env, jobject obj, jbyteArray source) { try { std::vector<jbyte> key = to_vector(env, get_field_value<jbyteArray>(env, obj, "__key")); std::vector<jbyte> iv = to_vector(env, get_field_value<jbyteArray>(env, obj, "__iv" )); CryptoPP::CBC_Mode< CryptoPP::AES >::Decryption d; d.SetKeyWithIV( reinterpret_cast<byte*>(&key.front()), KEY_SIZE, reinterpret_cast<byte*>(&iv.front()) ); CryptoPP::StreamTransformationFilter filter (d); jbytearray_holder data_holder(source, env); filter.Put(reinterpret_cast<byte*>(&*data_holder.begin()), data_holder.size()); filter.MessageEnd(); jbyteArray result = env->NewByteArray(filter.MaxRetrievable()); if (!result) throw std::runtime_error("No memory!"); jbytearray_holder result_holder(result, env); filter.Get(reinterpret_cast<byte*>(&*result_holder.begin()), result_holder.size()); return result; } catch (std::exception& e) { throw_jni_exception(env, e); } return NULL; }
рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
to_vector
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЖрдкрдХреЛ jbyteArray
(jni-array) рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд std::vector<jbyte>
рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ std::vector<jbyte>
jbytearray_holder
- рдПрдХ рд╡рд░реНрдЧ рдЬреЛ RAII рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгреА рдХреА рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрдиthrow_jni_exception
- рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИget_field_value
рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЬрдмрдХрд┐ byte[]
рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ byte[]
рддрдк рдХреНрд╖реЗрддреНрд░, рдмрд╛рдж рдореЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛
рдЙрдирдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рд╣реЗрд▓реНрдкрд░ рдХрд╛рд░реНрдп const size_t KEY_SIZE = 16; const size_t IV_SIZE = 16; std::vector<jbyte> to_vector(JNIEnv* env, jbyteArray data) { size_t data_len = env->GetArrayLength(data); std::vector<jbyte> result(data_len); if (data_len) { env->GetByteArrayRegion(data, 0, data_len, &*result.begin()); } return result; } class jbytearray_holder { public: typedef jbyte* iterator; jbytearray_holder(jbyteArray& ar, JNIEnv* env): m_env(env), m_ar(ar) { jboolean is_copy; m_data = m_env->GetByteArrayElements(m_ar, &is_copy); } template<typename T> T get_as() { return reinterpret_cast<T>(m_data); } iterator begin() { return reinterpret_cast<iterator>(m_data); } iterator end() { return begin() + size(); } size_t size() { return m_env->GetArrayLength(m_ar); } ~jbytearray_holder() { m_env->ReleaseByteArrayElements(m_ar, m_data, 0); } private: JNIEnv* m_env; jbyte* m_data; jbyteArray& m_ar; jbytearray_holder(jbytearray_holder&); jbytearray_holder& operator= (jbytearray_holder&); }; void throw_jni_exception(JNIEnv* env, const std::exception& e) { jclass excClass = env->FindClass("java/lang/IllegalArgumentException"); if (excClass) { std::string message = "Exception from native code: "; message += e.what(); env->ThrowNew(excClass, message.c_str()); } } template<typename T> T get_field_value(JNIEnv* env, jobject obj, const std::string& field_name); template<> jbyteArray get_field_value<jbyteArray>(JNIEnv* env, jobject obj, const std::string& field_name) { jclass clazz = env->GetObjectClass(obj); if (!clazz) throw std::runtime_error("No class!"); jfieldID fld = env->GetFieldID(clazz, field_name.c_str(), "[B"); jbyteArray result = static_cast<jbyteArray>(env->GetObjectField(obj, fld)); return result; } JNIEXPORT jbyteArray JNICALL Java_com_cryptodroid_crypto_AES_00024CBC_Encrypt(JNIEnv* env, jobject obj, jbyteArray source) { try { std::vector<jbyte> key = to_vector(env, get_field_value<jbyteArray>(env, obj, "__key")); std::vector<jbyte> iv = to_vector(env, get_field_value<jbyteArray>(env, obj, "__iv" )); CryptoPP::CBC_Mode< CryptoPP::AES >::Encryption e; e.SetKeyWithIV( reinterpret_cast<byte*>(&key.front()), KEY_SIZE, reinterpret_cast<byte*>(&iv.front()) ); CryptoPP::StreamTransformationFilter filter (e); jbytearray_holder data_holder(source, env); filter.Put(reinterpret_cast<byte*>(&*data_holder.begin()), data_holder.size()); filter.MessageEnd(); jbyteArray result = env->NewByteArray(filter.MaxRetrievable()); if (!result) throw std::runtime_error("No memory!"); jbytearray_holder result_holder(result, env); filter.Get(reinterpret_cast<byte*>(&*result_holder.begin()), result_holder.size()); return result; } catch (std::exception& e) { throw_jni_exception(env, e); } return NULL; }
рд╕рд┐рд╕реНрдЯрдо рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
Cipher _e = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv); _e.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec); byte[] encrypted = _e.doFinal(data); Cipher _d = Cipher.getInstance("AES/CBC/PKCS5Padding"); _d.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); byte[] decrypted = _d.doFinal(encrypted);
рдХреНрд░рд┐рдкреНрдЯреЛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреЙрд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдИ:
AES.CBC e = new AES.CBC(iv, key); byte[] encrypted = e.Encrypt(data); byte[] decrypted = e.Decrypt(encrypted);
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА
рджреЗрд╢реА рднрд╛рдЧ рдХреА рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛, ndk- рдмрд┐рд▓реНрдб рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬреЛ NDK рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдлрд╝рд╛рдЗрд▓ Android.mk рдФрд░ Application.mk рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореЗрдВ рд╡реИрд▓реНрдпреВрдЬрд╝ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
LOCAL_SRC_FILES
- рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреАLOCAL_MODULE
- рдореЙрдбреНрдпреВрд▓ рдирд╛рдоLOCAL_STATIC_LIBRARIES
- рд▓рд┐рдВрдХрд┐рдВрдЧ (рд╡реИрдХрд▓реНрдкрд┐рдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАLOCAL_CFLAGS
- рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХрд▓рдХ рдЭрдВрдбреЗ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)
Android.mk рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рд╣реИ:
- рдореИрдХреНрд░реЛ
CLEAR_VARS
- рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди (рдКрдкрд░ рджреЗрдЦреЗрдВ)
BUILD_xxx
рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ BUILD_xxx
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП BUILD_STATIC_LIBRARY
рдпрд╛ BUILD_SHARED_LIBRARY
Application.mk рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдзрд┐рдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
APP_STL
- STL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬAPP_ABI
- рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рд╕реВрдЪреАAPP_OPTIM
- рдмрд┐рд▓реНрдб рдкреНрд░рдХрд╛рд░ (рдбрд┐рдмрдЧ / рд░рд┐рд▓реАрдЬрд╝)APP_PLATFORM
- рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рд╕рдВрдХреЗрдд
рдкрд░рд┐рдгрд╛рдореА Android.mk рдлрд╝рд╛рдЗрд▓ (рдиреАрдЪреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ) рд╕рднреА рддреАрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП:
Andriod.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := nativecryptowrapper LOCAL_CFLAGS := -fexceptions -frtti LOCAL_SRC_FILES := nativecryptowrapper/aes_base.cpp LOCAL_STATIC_LIBRARIES := cryptopp include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := cryptopp LOCAL_CFLAGS := -fexceptions -frtti LOCAL_SRC_FILES := \ cryptopp/3way.cpp \ .... cryptopp/zdeflate.cpp \ cryptopp/zinflate.cpp \ cryptopp/zlib.cpp include $(BUILD_STATIC_LIBRARY)
Application.mk рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
APP_STL := gnustl_static APP_ABI := armeabi armeabi-v7a x86 APP_OPTIM := release APP_PLATFORM=android-9
рдХреНрд░рд┐рдкреНрдЯреЛ ++ рдпреБрдХреНрдд рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЧрдП рдереЗ:
- рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ
-fexceptions
рдФрд░ -frtti
LOCAL_CFLAGS
рдлрд╝рд╛рдЗрд▓ рдХреЗ -frtti
рдЪрд░ рдореЗрдВ -frtti
рдЧрдП -frtti
(рдЪреВрдВрдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдпрдиреЗрдорд┐рдХ_рдХрд╛рд╕реНрдЯ рдЕрдкрд╡рд╛рдж рдФрд░ рдХрд╛рд╕реНрдЯ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) - Application.mk рдлрд╝рд╛рдЗрд▓ рдореЗрдВ STL рдирд┐рд░реНрднрд░рддрд╛ (STL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - gnustl_static) рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
- рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕рдорд░реНрдерди (x86, рдЖрд░реНрдо)
рд╣рдо рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
рдЧрд┐рддреБрдм рдкрд░ рд╣реИ ред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд▓рд┐рдП, NDK r8d рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд▓рд╛рдВрдЪ
рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП,
System. nanoTime()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
System. nanoTime()
System. nanoTime()
рдореЗрдВ рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
System. nanoTime()
ред рдорд╛рдк рд▓рд┐рдпрд╛ рдЧрдпрд╛: рдореЗрдЧрдлреЙрди рдорд┐рдВрдЯ, рдкреЙрдХреЗрдЯрдмреБрдХ рдП 10ред рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
| рдореЗрдЧрдлреЙрди рдорд┐рдВрдЯ, рдПрдордПрд╕ | рдкреЙрдХреЗрдЯрдмреБрдХ рдП 10, рдПрдордПрд╕ |
---|
рд╕рд┐рд╕реНрдЯрдо рдХреНрд░рд┐рдкреНрдЯреЛ рдкреНрд░рджрд╛рддрд╛ | 998 | 1835 |
рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА | 231 | 970 |
рддреНрд╡рд░рдг | 4.3h | 1.9x |
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЧрддрд┐ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ x86 рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╕рдордп SIMD SSEx рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдирддреАрдЬрддрди, рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдореВрд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдИрдПрд╕ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:
1. рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб:
http://ru.wikipedia.org2. рдХреНрд░рд┐рдкреНрдЯреЛ ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА:
http://www.cryptopp.com3. Adnroid NDK:
http://developer.android.com