fork(2) download
  1. // Trip.cs
  2.  
  3. namespace Twin.Tools
  4. {
  5. using System;
  6. using FreeBSD.Security.Cryptography;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9.  
  10. /// <summary>
  11. /// トリップを生成するクラス
  12. /// http://w...content-available-to-author-only...o.jp/files/miscprj-dev/
  13. /// http://w...content-available-to-author-only...o.jp/files/miscprj-dev/CSharp/Etc/TripMaker.zipを使わせていただきました
  14. /// ↓変わったみたい
  15. /// http://w...content-available-to-author-only...b.com/pukiwiki/pukiwiki.php
  16. /// ↓
  17. /// 消えちゃったみたい
  18. /// ↓
  19. /// NTwin23.105 2009/06/19 2ちゃんねる12桁トリップ仕様により大幅変更
  20. /// </summary>
  21. public class Trip
  22. {
  23. /// <summary>
  24. /// 指定したキーを使用してトリップを生成
  25. /// </summary>
  26. /// <param name="key"></param>
  27. /// <returns></returns>
  28. public static string Create( string key )
  29. {
  30. if (key == null) {
  31. throw new ArgumentNullException("key");
  32. }
  33. if (key.Length == 0) {
  34. throw new ArgumentException("key");
  35. }
  36.  
  37. string trip="???";
  38. if ( key.Length >= 12 )
  39. {
  40. // 2013/03/21 Mizutama コメント追加
  41. // 【堅牢】トリップの新方式を考えてみませんか【互換性】 http://q...content-available-to-author-only...h.net/test/read.cgi/operate/1244993904/309,342
  42. // 1. #(12文字以上) で新仕様発動、 #(11文字以下) は従来通り
  43. if ( (key[0] == '#') || (key[0] == '$') )
  44. {
  45. // 神仕様
  46. //1) そのうえで ## #$ は特別な意味を持つ
  47. //1a)
  48. //- ##(8文字分の16進ASCIIコード) で、「ASCIIコードによる直接入力」により文字列を設定可能
  49. //- ##(8文字分の16進ASCIIコード)(0~2桁のsalt) とすることにより、saltをも設定可能
  50. //- 上記では「従来アルゴリズム」により、10桁のトリップを生成
  51. //- 上記以外の ##(11文字以上) は将来の拡張のために予約、現在は何を指定しても ◆??? 表示
  52. //1b)
  53. //- #$(11文字以上) は将来の拡張のために予約、現在は何を指定しても ◆??? 表示
  54. // 2013/03/21 Mizutama コメント追加
  55. Match mm = Regex.Match( key , "^#([0-9A-Fa-f]{16})([./0-9A-Za-z]{0,2})$" );
  56. if ( mm.Success )
  57. {
  58. byte[] pb = HexString2ByteArray( mm.Groups[1].Value );
  59. key = Encoding.ASCII.GetString( pb );
  60. trip = CreateCore( key , mm.Groups[2].Value );
  61. }
  62. }
  63. else
  64. {
  65. //byte[] instr = System.Text.Encoding.ASCII.GetBytes( key ); // 2013/03/21 Mizutama
  66. byte[] instr = System.Text.Encoding.GetEncoding( "Shift_JIS" ).GetBytes( key ); // 漢字だとトリップが正しくなくなるよなぁ
  67. System.Security.Cryptography.SHA1 sha1
  68. = System.Security.Cryptography.SHA1.Create();
  69. byte[] hash = sha1.ComputeHash( instr );
  70. trip = Convert.ToBase64String( hash ).Substring( 0 , 12 );
  71. trip = trip.Replace( '+' , '.' ); // NTwin2.3.109
  72. }
  73. }
  74. else
  75. {
  76. string saltKey = key + "H.";
  77. trip = CreateCore( key , new string( new char[] { saltKey[1] , saltKey[2] } ) );
  78. }
  79.  
  80. return trip;
  81. }
  82.  
  83. public static string CreateCore( string key , string salt )
  84. {
  85. if ( key == null )
  86. {
  87. throw new ArgumentNullException( "key" );
  88. }
  89. if ( key.Length == 0 )
  90. {
  91. throw new ArgumentException( "key" );
  92. }
  93.  
  94. char s1 = salt[0] , s2 = salt[1];
  95. if ( s1 < '.' || 'z' < s1 ) s1 = '.';
  96. if ( s2 < '.' || 'z' < s2 ) s2 = '.';
  97. if ( ':' <= s1 && s1 <= '@' ) s1 += (char)7;
  98. if ( ':' <= s2 && s2 <= '@' ) s2 += (char)7;
  99. if ( '[' <= s1 && s1 <= '`' ) s1 += (char)6;
  100. if ( '[' <= s2 && s2 <= '`' ) s2 += (char)6;
  101. salt = s1.ToString() + s2.ToString();
  102.  
  103. TraditionalDES des = new TraditionalDES();
  104. string hash = des.Crypt( key , salt );
  105.  
  106. return hash.Substring( hash.Length - 10 );
  107. }
  108.  
  109. public static byte[] HexString2ByteArray( string str )
  110. {
  111. int digits = str.Length / 2;
  112. byte[] bytes = new byte[digits];
  113. for ( int i=0; i<digits; i++ )
  114. {
  115. bytes[i] = Convert.ToByte( str.Substring( i*2 , 2 ) , 16 );
  116. }
  117. return bytes;
  118. }
  119. }
  120. }
  121.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty