The Boilermakers (20-3, 8-3) have won six straight, while the Spartans (19-6, 9-3) have lost three in a row to lose their commanding lead in the Big Ten.
Michigan State coach Tom Izzo previously predicted the conference champion would have four or five losses.
"We're getting closer to that number now — unfortunately," he said.
Kalin Lucas played after missing a game with a sprained right ankle. He gave Michigan State a three-point lead with 13:16 left in the first half, then Purdue scored twice as much as the Spartans the rest of the first half to take a 47-33 lead.
Michigan State trailed by 18 points early in the second half, but pulled within three with 4½ minutes left.
The Boilermakers held off the rally to snap a nine-game skid at the Breslin Center and reach the 20-win mark for the fourth straight season.
"It was a great atmosphere — one of the best in college basketball — and it's tough to play when you can't hear yourself think," Purdue coach Matt Painter said. "This is an unbelievable place, and we're fortunate to get a victory."
Michigan State's Chris Allen, who scored 21 points, made a 3-pointer to make it 65-62.
Purdue closed the game with an 11-2 run, making the score lopsided as it was for much of the night.
"The major surprise to me is a lack of effort right now," Izzo said.
The loss dropped Michigan State into a first-place tie with Illinois, which won at Wisconsin on Tuesday.
Purdue's win puts it in a second-place tie with No. 13 Ohio State.
The Spartans' 12-point loss at home was their biggest since Illinois beat them 81-68 four years ago, and snapped their 18-game winning streak there since losing to Penn State more than a year ago.
The Boilermakers, coming off their first win at Indiana in more than a decade, won at Michigan State for the first time since 1998.
"It's great for our seniors," Painter said.
Purdue has three wins over Top 10 teams for the second time in school history and the first since 1989-90, adding to its previous victories over then-No. 6 West Virginia and then-No. 9 Tennessee.
As usual, three Boilermakers led the way.
Moore scored 14 points and Johnson had 13 in the first half alone. Robbie Hummel finished with 15 points.
Lucas played through pain to scored 12 points, while Korie Lucious, who started in his place, had nine points.
"Lucas did an incredible job considering he hasn't practiced one second," Izzo said.
Durrell Summers, who had a season-high 24 points in Michigan State's previous home game, missed both his shots, scored just two points and watched the entire second half from the bench.
"I just played the guys I thought gave us the best chance to win," Izzo said when asked why Summers didn't play after halftime.