収監された2人は1996年11月の仮釈放後も無実を訴え、民間人の有志による「布川事件守る会」が2001年12月6日に第二次再審請求（1回目は収監中の1983年12月23日に行われ棄却された）を水戸地裁土浦支部に申立て、同支部は2005年9月21日に再審開始を決定した。これに対して検察側が東京高裁に即時抗告するが、2008年7月14日、東京高裁（門野博裁判長）は棄却して再審開始決定を支持する。東京高検の鈴木和宏次席検事は「内容を十分検討し、最高検とも協議のうえ適切に対処したい」と述べ、その後、最高裁判所に特別抗告するが、2009年12月15日、最高裁（竹内行夫裁判長）は、検察側の特別抗告を棄却し再審開始が確定。2010年7月9日に水戸地方裁判所土浦支部にて再審第1回公判が開かれる。以後6度の公判を重ね、判決は2011年3月16日に言い渡しを予定していた。しかし直前に発生した東日本大震災（3月11日）の影響により判決公判が5月24日に延期となった。2011年5月24日、仕切り直しの判決公判が行われ、被告の両名に強盗殺人罪について無罪、別件の窃盗罪や暴行罪について懲役2年・執行猶予3年の判決が言い渡された。なお、別件については猶予期間は既に満了、実質、刑の言渡しの効力を失っている。検察側は「控訴審での新たな立証は困難と判断した」として、強盗殺人罪について6月7日控訴を断念、無罪判決が確定した。再審無罪判決では目撃証言を含む全ての状況証拠について、その能力及び信用性が否定された。本事件で再審無罪までにかかった期間は44年であり、これは戦後に起きた事件の中で最長である。
10月23日に2人は本件強盗殺人容疑で逮捕され、12月28日に同容疑で起訴された。公判で両人は「自白は取手警察署刑事課刑事に強要されたものである」として全面否認したが、1970年10月6日に第一審の水戸地裁土浦支部は無期懲役とし、1973年12月20日の第二審の東京高裁では「ほかに犯人がいるのではないかと疑わせるものはない」として控訴を棄却し、1978年7月3日に最高裁で上告が棄却され、2人とも無期懲役が確定した。同日から2人は千葉刑務所へ下獄することとなった。桜井は刑務所で詩を書いて雑誌に投稿するうち、声楽家の佐藤光政との知遇を得、やがて作詞作曲した歌は佐藤の声でCD化されるまでになった。後には書き溜めた詩が『語句詩集 壁のうた』と題した詩集にもなった。だが、桜井は服役中の1977年と1992年に両親を亡くしてもいる。杉山は、未決囚として東京拘置所に収監されていた頃は袴田事件の袴田巌や、大森勧銀事件の近田才典、金嬉老事件の金嬉老とも交流があったという。連続ピストル射殺事件の永山則夫とは特に親しく、運動時間には必ず会話し、文通も行う仲であったという。
桜井 昌司（さくらい しょうじ）は、1947年1月24日に栃木県塩谷郡塩谷村で、役所吏員の父と野菜行商の母との間に生まれた。茨城県立竜ヶ崎第一高校に入学したが、家庭内不和などから中退し、その後は定職に就かず徒遊生活を送っていた。桜井は1967年10月10日の深夜、友人のズボン1本を盗んだとの容疑で別件逮捕され、取手署に留置された。桜井はすぐに窃盗容疑を認めたが、その後も別件と本件合わせて30日間に渡る勾留日数中、本件である強盗殺人についての取調べを受け続けた（窃盗の件は後に不起訴となった）。そして、10月15日に桜井が行った「杉山と一緒に殺して金を盗った」との自白に基づき、翌16日に桜井の兄の友人である杉山卓男が逮捕された。杉山 卓男（すぎやま たかお）は、1946年8月23日に地元の利根町で生まれ、役所吏員であった父を亡くしてからは教員であった母に育てられた。桜井と同じく竜ヶ崎第一高校へ入学したが無免許運転で退学となり、その後は機械工をしていた。だが、母の死などで生活は荒れ、19歳の時には乱闘騒ぎで保護観察処分を受けていた。暴力団の抗争にも参加し、恐喝や喧嘩が日常となっていた杉山にとって、16日の逮捕も意外なことではなかったという。逮捕容疑は同年8月に起こした暴力行為事件についてであったが、やはり桜井と同じくこれは別件逮捕であった。別件での取調べ後は杉山も本件について引き続き調べを受け、翌17日に強盗殺人を自白した。
C言語によるクイックソートの実装例を示す。typedef int value_type; /* ソートするキーの型 *//* x, y, z の中間値を返す */value_type med3(value_type x, value_type y, value_type z) {    if (x < y) {        if (y < z) return y; else if (z < x) return x; else return z;    } else {        if (z < y) return y; else if (x < z) return x; else return z;    }}/* クイックソート * a     : ソートする配列 * left  : ソートするデータの開始位置 * right : ソートするデータの終了位置 */void quicksort(value_type a[], int left, int right) {    if (left < right) {        int i = left, j = right;        value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2 ではオーバーフローしてしまう */        while (1) { /* a[] を pivot 以上と以下の集まりに分割する */            while (a[i] < pivot) i++; /* a[i] >= pivot となる位置を検索 */            while (pivot < a[j]) j--; /* a[j] <= pivot となる位置を検索 */            if (i >= j) break;            tmp = a[i]; a[i] = a[j]; a[j] = tmp; /* a[i], a[j] を交換 */            i++; j--;        }        quicksort(a, left, i - 1);  /* 分割した左を再帰的にソート */        quicksort(a, j + 1, right); /* 分割した右を再帰的にソート */    }}